diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b25c15b81fae06e1c55946ac6270bfdb293870e8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+*~
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d4647327328e1456504fba53ff695e7aaf9ac6d6
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,102 @@
+stages:
+  - build
+
+ifort (debug):
+  stage: build
+  script:
+    - ./configure build --intel --build-type Debug
+    - cd build
+    - make -j8
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    when: on_failure
+    expire_in: 1 week
+    paths:
+    - build/Testing/Temporary/LastTest.log
+
+ifort (release):
+  only:
+    refs:
+      - schedules
+  stage: build
+  script:
+    - ./configure build --intel --build-type Release
+    - cd build
+    - make 
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    expire_in: 1 week
+    when: on_failure
+    paths:
+    - build/Testing/Temporary/LastTest.log
+    
+ifort-omp (debug):
+#  only:
+#    refs:
+#      - schedules
+  stage: build
+  script:
+    - ./configure build --intel --omp --build-type Debug
+    - cd build
+    - make -j8
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    expire_in: 1 week
+    when: on_failure
+    paths:
+    - build/Testing/Temporary/LastTest.log   
+
+
+gnu (debug):
+  stage: build
+  script:
+    - ./configure build --gnu --build-type Debug
+    - cd build
+    - make -j8
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    expire_in: 1 week
+    when: on_failure
+    paths:
+    - build/Testing/Temporary/LastTest.log
+
+gnu-hybrid (debug):
+  stage: build
+  script:
+    - ./configure build --gnu --mpi --omp --build-type Debug
+    - cd build
+    - make -j8
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    expire_in: 1 week
+    when: on_failure
+    paths:
+    - build/Testing/Temporary/LastTest.log
+
+gnu (release):
+  only:
+    refs:
+      - schedules
+  stage: build
+  script:
+    - ./configure build --gnu --build-type Release
+    - cd build
+    - make 
+    - ctest -VV
+  tags:
+    - ubuntu
+  artifacts:
+    expire_in: 1 week
+    when: on_failure
+    paths:
+    - build/Testing/Temporary/LastTest.log
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..220ee53ba5b9bd290ac97172e4d89184a0391d6b
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,252 @@
+# Cmake Project file for RelaxSE
+
+cmake_minimum_required(VERSION 3.0)
+project (RelaxSE)
+
+# these are paths that CMake will search for cmake
+# module files that end with .cmake
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+
+enable_language (Fortran)
+
+find_package( LAPACK REQUIRED )
+find_package( BLAS REQUIRED )
+  
+# make sure that the default is a RELEASE
+if (NOT CMAKE_BUILD_TYPE)
+  set (CMAKE_BUILD_TYPE RELEASE CACHE STRING
+      "Choose the type of build, options are: None Debug Release Opt Profiling."
+      FORCE)
+endif (NOT CMAKE_BUILD_TYPE)
+
+if (CMAKE_BUILD_TYPE MATCHES Debug)
+  message ("Debug build ")
+  add_definitions(-DVAR_DEBUG)
+elseif (CMAKE_BUILD_TYPE MATCHES Check)
+  message ("Debug build with extra checks")
+  add_definitions(-DVAR_DEBUG)
+else()
+  message ("Build type " ${CMAKE_BUILD_TYPE})
+endif ()
+
+if(ENABLE_NOGEN)
+  message ("Naive (non-generated) implementation -- only for test purposes")
+  add_definitions(-DVAR_NOGEN)
+endif()
+
+# default installation
+get_filename_component (default_prefix ".." ABSOLUTE)
+set (CMAKE_INSTALL_PREFIX ${default_prefix} CACHE STRING
+      "Choose the installation directoryy."
+      FORCE)
+
+# FFLAGS depend on the compiler
+get_filename_component (Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME)
+
+if (CMAKE_Fortran_COMPILER_ID MATCHES GNU)  
+  # gfortran
+  set (CMAKE_Fortran_FLAGS_OPT "-funroll-all-loops -fno-f2c -O3")
+  set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
+  set (CMAKE_Fortran_FLAGS_DEBUG   "-fno-f2c -O0 -g  -fbacktrace ")
+  set (CMAKE_Fortran_FLAGS_CHECK "${CMAKE_Fortran_FLAGS_DEBUG} -Wall -Wextra -Warray-temporaries -Wconversion -Wrealloc-lhs -ffree-line-length-0 -fcheck=all -ffpe-trap=zero,overflow,underflow -finit-real=nan") #-fimplicit-none
+  set(CMAKE_Fortran_FLAGS_PROFILE "${CMAKE_Fortran_FLAGS_RELEASE} -g -pg")
+  if(ENABLE_STATIC_LINKING)
+    set(CMAKE_Fortran_FLAGS
+      "${CMAKE_Fortran_FLAGS} -static"
+      )
+  endif()
+  add_definitions(-DVAR_GNU)
+  if(ENABLE_OMP)
+    add_definitions(-DVAR_OMP)
+    set(CMAKE_Fortran_FLAGS
+      "${CMAKE_Fortran_FLAGS} -fopenmp"
+      )
+  endif()
+
+  if (CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER 10)
+    set(CMAKE_Fortran_FLAGS
+      "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch"
+      )
+  endif()
+  
+elseif (CMAKE_Fortran_COMPILER_ID MATCHES Intel)
+  # ifort 
+  set (CMAKE_Fortran_FLAGS_OPT "-O3")
+  set (CMAKE_Fortran_FLAGS_RELEASE "-O2")
+  set (CMAKE_Fortran_FLAGS_DEBUG   "-O0 -g -traceback")
+  set (CMAKE_Fortran_FLAGS_CHECK "${CMAKE_Fortran_FLAGS_DEBUG} -check all -check arg_temp_created")
+  set (CMAKE_SHARED_LIBRARY_LINK_Fortran_FLAGS "-shared-intel")
+  add_definitions(-DVAR_INTEL)
+  if(ENABLE_OMP)
+    add_definitions(-DVAR_OMP)
+    if(NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 18)  
+      set(CMAKE_Fortran_FLAGS
+	"${CMAKE_Fortran_FLAGS} -qopenmp -qoverride-limits" #-threadprivate:compat 
+	)
+    else()
+      set(CMAKE_Fortran_FLAGS
+	"${CMAKE_Fortran_FLAGS} -fopenmp"
+	)
+    endif()
+  endif()
+endif ()
+
+if(ENABLE_MPI)
+  find_package(MPI)
+  if(MPI_Fortran_FOUND) 
+    add_definitions(-DVAR_MPI)
+  else()
+    message(FATAL_ERROR "-- You asked for MPI, but CMake could not find any MPI installation, check $PATH")
+  endif()
+endif()
+
+include(RelaxSE_Sources)
+
+# Common Libraries
+add_library(RelaxSE_common
+  ${RELAXSE_COMMON})
+
+if(MPI_Fortran_FOUND)
+  target_include_directories(RelaxSE_common PRIVATE 
+    ${MPI_Fortran_INCLUDE_PATH})
+  target_link_libraries(RelaxSE_common
+    ${MPI_Fortran_LIBRARIES}
+    )
+endif()
+
+add_library(RelaxSE_IO
+  ${RELAXSE_SOURCES_IO})
+
+add_dependencies(RelaxSE_IO RelaxSE_common)
+
+add_library(RelaxSE_type
+  ${RELAXSE_SOURCES_TYPE})
+
+add_dependencies(RelaxSE_type RelaxSE_IO)
+add_dependencies(RelaxSE_type RelaxSE_common)
+
+#Generated or non-generated Code
+if(ENABLE_NOGEN)
+  add_library(RelaxSE_lib
+    ${RELAXSE_SOURCES}
+    ${RELAXSE_generator_SOURCES})
+else ()
+   add_library(RelaxSE_fockgen
+     ${RELAXSE_fockgen_SOURCES})
+   add_dependencies(RelaxSE_fockgen RelaxSE_IO)
+   add_dependencies(RelaxSE_fockgen RelaxSE_common)
+   add_dependencies(RelaxSE_fockgen RelaxSE_type)
+
+   add_library(RelaxSE_intgen
+     ${RELAXSE_intgen_SOURCES})
+   add_dependencies(RelaxSE_intgen RelaxSE_IO)
+   add_dependencies(RelaxSE_intgen RelaxSE_common)
+   add_dependencies(RelaxSE_intgen RelaxSE_type)
+  
+  add_library(RelaxSE_lib
+    ${RELAXSE_SOURCES}
+    ${RELAXSE_gen_SOURCES})
+  add_dependencies(RelaxSE_lib RelaxSE_fockgen)
+  add_dependencies(RelaxSE_lib RelaxSE_intgen)
+endif()
+
+add_dependencies(RelaxSE_lib RelaxSE_type)
+add_dependencies(RelaxSE_lib RelaxSE_IO)
+add_dependencies(RelaxSE_lib RelaxSE_common)
+
+add_library(RelaxSE_prop
+  ${RELAXSE_SOURCES_prop})
+add_dependencies(RelaxSE_prop RelaxSE_type)
+add_dependencies(RelaxSE_prop RelaxSE_IO)
+add_dependencies(RelaxSE_prop RelaxSE_common)
+add_dependencies(RelaxSE_prop RelaxSE_lib)
+
+
+if(MPI_Fortran_FOUND)
+  target_include_directories(RelaxSE_lib PRIVATE 
+    ${MPI_Fortran_INCLUDE_PATH})
+  target_link_libraries(RelaxSE_lib
+    ${MPI_Fortran_LIBRARIES}
+    )
+endif()
+
+
+#Executables
+if(ENABLE_NOGEN)
+  ### Code generator for the diagonal part
+  add_executable(hdiag.x src/generator/code_gener_hdiag.F90)
+  target_link_libraries(hdiag.x
+    RelaxSE_lib
+    RelaxSE_type
+    RelaxSE_IO
+    RelaxSE_common
+    ${LAPACK_LIBRARIES}
+    ${BLAS_LIBRARIES}
+    )
+
+  ### Code generator for the off-diagonal part
+  add_executable(hvblock.x src/generator/code_gener_hv_blocs.F90)
+  target_link_libraries(hvblock.x
+    RelaxSE_lib
+    RelaxSE_type
+    RelaxSE_IO
+    RelaxSE_common
+    ${LAPACK_LIBRARIES}
+    ${BLAS_LIBRARIES}
+    )
+  
+  execute_process(COMMAND cp -r ${CMAKE_SOURCE_DIR}/src/generator/update_gencode.sh ${CMAKE_BINARY_DIR}/)
+
+  ### SASS program
+  add_executable(relaxse.x src/RelaxSE.F90)
+  target_link_libraries(relaxse.x
+  RelaxSE_lib
+  RelaxSE_type
+  RelaxSE_IO
+  RelaxSE_common
+  ${LAPACK_LIBRARIES}
+  ${BLAS_LIBRARIES}
+  )
+else()
+  ### SASS program
+  add_executable(relaxse.x src/RelaxSE.F90)
+  target_link_libraries(relaxse.x
+    RelaxSE_lib
+    RelaxSE_type
+    RelaxSE_IO
+    RelaxSE_common
+    RelaxSE_fockgen
+    RelaxSE_intgen
+    ${LAPACK_LIBRARIES}
+    ${BLAS_LIBRARIES}
+    )
+endif()
+
+### Code for properties calculations
+add_executable(prop.x src/prop.F90)
+target_link_libraries(prop.x
+  RelaxSE_lib
+  RelaxSE_prop
+  RelaxSE_type
+  RelaxSE_IO
+  RelaxSE_common
+  ${LAPACK_LIBRARIES}
+  ${BLAS_LIBRARIES}
+  )
+
+### Unitests
+enable_testing()
+
+include(Test_Sources)
+
+# copy test scripts to build/test
+execute_process(COMMAND mkdir -p ${CMAKE_BINARY_DIR}/test)
+execute_process(COMMAND cp -r ${CMAKE_SOURCE_DIR}/test/runtest ${CMAKE_BINARY_DIR}/test)
+execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/test/runtest_config.py ${CMAKE_BINARY_DIR}/test)
+execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/test/runtest_relaxse.py ${CMAKE_BINARY_DIR}/test)
+execute_process(COMMAND cp ${CMAKE_SOURCE_DIR}/test/runtest_v1.py ${CMAKE_BINARY_DIR}/test)
+
+include(TestsRelaxSE)
+
+include(CTest)
+
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000000000000000000000000000000000000..f288702d2fa16d3cdf0035b15a9fcbc552cd88e7
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<https://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<https://www.gnu.org/licenses/why-not-lgpl.html>.
diff --git a/COPYING.LESSER b/COPYING.LESSER
new file mode 100644
index 0000000000000000000000000000000000000000..153d416dc8d2d60076698ec3cbfce34d91436a03
--- /dev/null
+++ b/COPYING.LESSER
@@ -0,0 +1,165 @@
+                   GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+  This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+  0. Additional Definitions.
+
+  As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+  "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+  An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+  A "Combined Work" is a work produced by combining or linking an
+Application with the Library.  The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+  The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+  The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+  1. Exception to Section 3 of the GNU GPL.
+
+  You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+  2. Conveying Modified Versions.
+
+  If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+   a) under this License, provided that you make a good faith effort to
+   ensure that, in the event an Application does not supply the
+   function or data, the facility still operates, and performs
+   whatever part of its purpose remains meaningful, or
+
+   b) under the GNU GPL, with none of the additional permissions of
+   this License applicable to that copy.
+
+  3. Object Code Incorporating Material from Library Header Files.
+
+  The object code form of an Application may incorporate material from
+a header file that is part of the Library.  You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+   a) Give prominent notice with each copy of the object code that the
+   Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the object code with a copy of the GNU GPL and this license
+   document.
+
+  4. Combined Works.
+
+  You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+   a) Give prominent notice with each copy of the Combined Work that
+   the Library is used in it and that the Library and its use are
+   covered by this License.
+
+   b) Accompany the Combined Work with a copy of the GNU GPL and this license
+   document.
+
+   c) For a Combined Work that displays copyright notices during
+   execution, include the copyright notice for the Library among
+   these notices, as well as a reference directing the user to the
+   copies of the GNU GPL and this license document.
+
+   d) Do one of the following:
+
+       0) Convey the Minimal Corresponding Source under the terms of this
+       License, and the Corresponding Application Code in a form
+       suitable for, and under terms that permit, the user to
+       recombine or relink the Application with a modified version of
+       the Linked Version to produce a modified Combined Work, in the
+       manner specified by section 6 of the GNU GPL for conveying
+       Corresponding Source.
+
+       1) Use a suitable shared library mechanism for linking with the
+       Library.  A suitable mechanism is one that (a) uses at run time
+       a copy of the Library already present on the user's computer
+       system, and (b) will operate properly with a modified version
+       of the Library that is interface-compatible with the Linked
+       Version.
+
+   e) Provide Installation Information, but only if you would otherwise
+   be required to provide such information under section 6 of the
+   GNU GPL, and only to the extent that such information is
+   necessary to install and execute a modified version of the
+   Combined Work produced by recombining or relinking the
+   Application with a modified version of the Linked Version. (If
+   you use option 4d0, the Installation Information must accompany
+   the Minimal Corresponding Source and Corresponding Application
+   Code. If you use option 4d1, you must provide the Installation
+   Information in the manner specified by section 6 of the GNU GPL
+   for conveying Corresponding Source.)
+
+  5. Combined Libraries.
+
+  You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+   a) Accompany the combined library with a copy of the same work based
+   on the Library, uncombined with any other library facilities,
+   conveyed under the terms of this License.
+
+   b) Give prominent notice with the combined library that part of it
+   is a work based on the Library, and explaining where to find the
+   accompanying uncombined form of the same work.
+
+  6. Revised Versions of the GNU Lesser General Public License.
+
+  The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+  Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+  If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
\ No newline at end of file
diff --git a/LGPL_header.txt b/LGPL_header.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3841ec75b433e9ef452174d5b92e4a9ca12c8062
--- /dev/null
+++ b/LGPL_header.txt
@@ -0,0 +1,59 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+   
+    write(f_gen,'(A)') '!!-------------------------------------------------------'
+    write(f_gen,'(A)') '!!---- Relaxed Selected Excitation (RelaxSE)'
+    write(f_gen,'(A)') '!!-------------------------------------------------------'
+    write(f_gen,'(A)') '!!---- This file is part of RelaxSE'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- The RelaxSE project is distributed under LGPL. In agreement with the'
+    write(f_gen,'(A)') '!!---- Intergovernmental Convention of the ILL, this software cannot be used'
+    write(f_gen,'(A)') '!!---- in military applications.'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE'
+    write(f_gen,'(A)') '!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr'
+    write(f_gen,'(A)') '!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- RelaxSE is free software; you can redistribute it and/or'
+    write(f_gen,'(A)') '!!---- modify it under the terms of the GNU Lesser General Public'
+    write(f_gen,'(A)') '!!---- License as published by the Free Software Foundation; either'
+    write(f_gen,'(A)') '!!---- version 3.0 of the License, or (at your option) any later version.'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- RelaxSE is distributed in the hope that it will be useful,'
+    write(f_gen,'(A)') '!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of'
+    write(f_gen,'(A)') '!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU'
+    write(f_gen,'(A)') '!!---- Lesser General Public License for more details.'
+    write(f_gen,'(A)') '!!---- '
+    write(f_gen,'(A)') '!!---- You should have received a copy of the GNU Lesser General Public'
+    write(f_gen,'(A)') '!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.'
+    write(f_gen,'(A)') '!!---- '
diff --git a/README.md b/README.md
index 67f2ea51f6d5678983d0403e4ece0f78b5e5aca5..1a579ef8118f37e31453240943955feb7af3d5c4 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,54 @@
 # relaxse-code
+--------------------------------------------------
+# Relaxed Selected Excitation (RelaxSE)
+--------------------------------------------------
+
+The RelaxSE project is distributed under LGPL. In agreement with the
+Intergovernmental Convention of the ILL, this software cannot be used
+in military applications.
+
+Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+                         Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+
+Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+         Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+
+RelaxSE is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 3.0 of the License, or (at your option) any later version.
+
+RelaxSE is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, see <http://www.gnu.org/licenses/>.
+
+---
+# Compilation
+---
+
+## Dependencies
+- cmake (>3.5) python (>3.4)
+- fortran compiler (gfortran or ifort)
+- OpenMP and/or MPI for parallel compilation
+- blas and lapack libraries
+
+NB: for linux it might be necessary to make a symlink for blas and lapack
+ln -s libblas.so.3 libblas.a
+ln -s liblapack.so.3 liblapack.a
+
+## Configure 
+- ./configure buildname
+- cd buildname
+- make
+
+## Running
+- INPUT, file.ref0, file.TraInt, file.TraOne in the same directory
+- relaxse.x 
+
+## Compilation options
+CC=`which gcc` CXX=`which g++` FC=`which gfortran` ./configure --build-type Debug builddir
 
diff --git a/cmake/RelaxSE_Sources.cmake b/cmake/RelaxSE_Sources.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..c7168d51a32555ad73ae96907a1b14e5e0163737
--- /dev/null
+++ b/cmake/RelaxSE_Sources.cmake
@@ -0,0 +1,98 @@
+set(RELAXSE_COMMON
+  src/dimensions.F90
+  src/utils_char.F90
+  src/files.F90
+  )
+
+set(RELAXSE_SOURCES_IO
+  src/info.F90
+  src/def_files.F90
+  src/cio.h
+  src/cio.c
+  src/molcastype.h
+  src/sort.F90
+  )
+
+set(RELAXSE_SOURCES_TYPE
+  src/all_case.F90
+  src/utils_bits.F90
+  src/typedet.F90
+  src/utils.F90
+  src/vec_storage.F90
+  src/hole_part_cases.F90
+  src/type_twoint.F90
+  src/typetargetvec.F90
+  src/detact.F90
+  src/typebraket.F90 
+  src/spindetact.F90
+  src/utils_twoint.F90
+  src/utils_det.F90 
+  src/utils_wrt.F90
+  )
+
+set(RELAXSE_SOURCES
+  src/jacscf.f
+  #src/given.f
+  src/orthog.F90
+  src/diag.F90
+  src/explicit_Hmat.F90
+  src/lect_data.F90
+  src/lect_int.F90 
+  src/orb_ordering.F90 
+  src/ordre.F90
+  src/ref0.F90
+  src/ref1.F90
+  src/RelaxSE_diag.F90
+  
+  src/screening.F90
+  src/fock.F90
+  src/gener_guess.F90
+  src/gener_diagJK.F90
+  src/gener_det.F90
+
+  src/utils_batch.F90
+  src/mpi_blockpair.F90
+  src/hv_blocs.F90
+  src/hv_blocs_int.F90
+  src/compute_hv.F90 
+  )
+
+set(RELAXSE_generator_SOURCES
+  src/generator/all_case_gen.F90
+  src/generator/codegen_hdiag_block.F90
+  src/generator/codegen_hv_blocs.F90
+  src/generator/codegen_hv_blocs_int.F90
+  src/generator/codegen_hv_blocs_2hj.F90  
+  )
+
+include(RelaxSE_gen)
+
+set(RELAXSE_gen_SOURCES
+  src/gencode/generated.F90
+  src/gencode/hv_generated.F90
+  src/gencode/fock_generated.F90
+  src/gencode/aaaa_generated.F90
+  src/gencode/vvaa_generated.F90
+  src/gencode/vaao_generated.F90
+  src/gencode/vaaa_generated.F90
+  src/gencode/aaoo_generated.F90
+  src/gencode/aaao_generated.F90
+  src/gencode/vvoo_generated.F90
+  src/gencode/vvao_generated.F90
+  src/gencode/vaoo_generated.F90
+  src/gencode/vava_generated.F90
+  src/gencode/vvvo_generated.F90
+  src/gencode/vvva_generated.F90
+  src/gencode/vvvv_generated.F90
+  src/gencode/oooo_generated.F90
+  src/gencode/vovo_generated.F90
+  src/gencode/aooo_generated.F90
+  src/gencode/vavo_generated.F90
+  src/gencode/vooo_generated.F90
+  src/gencode/aoao_generated.F90
+  src/gencode/voao_generated.F90
+  )
+
+
+
+include(RelaxSE_prop)
diff --git a/cmake/RelaxSE_gen.cmake b/cmake/RelaxSE_gen.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..17f69d2022c35a36a783661dbb96547116ea8443
--- /dev/null
+++ b/cmake/RelaxSE_gen.cmake
@@ -0,0 +1,304 @@
+set(RELAXSE_fockgen_SOURCES
+  src/gencode/fock_000_000_generated.F90
+  src/gencode/fock_000_p01_generated1.F90
+  src/gencode/fock_000_p01_generated2.F90
+  src/gencode/fock_000_p11_generated.F90
+  src/gencode/fock_000_m11_generated1.F90
+  src/gencode/fock_000_m11_generated2.F90
+  src/gencode/fock_p01_p01_generated1.F90
+  src/gencode/fock_p01_p01_generated2.F90
+  src/gencode/fock_p01_p02_generated1.F90
+  src/gencode/fock_p01_p02_generated2.F90
+  src/gencode/fock_p01_p02_generated3.F90
+  src/gencode/fock_p01_p02_generated4.F90
+  src/gencode/fock_p01_p11_generated1.F90
+  src/gencode/fock_p01_p11_generated2.F90
+  src/gencode/fock_p01_p12_generated1.F90
+  src/gencode/fock_p01_p12_generated2.F90
+  src/gencode/fock_p01_m11_generated1.F90
+  src/gencode/fock_p01_m11_generated2.F90
+  src/gencode/fock_p01_m12_generated1.F90
+  src/gencode/fock_p01_m12_generated2.F90
+  src/gencode/fock_p01_m12_generated3.F90
+  src/gencode/fock_p01_m12_generated4.F90
+  src/gencode/fock_p02_p02_generated1.F90
+  src/gencode/fock_p02_p02_generated2.F90
+  src/gencode/fock_p02_p02_generated3.F90
+  src/gencode/fock_p02_p02_generated4.F90
+  src/gencode/fock_p02_p12_generated1.F90
+  src/gencode/fock_p02_p12_generated2.F90
+  src/gencode/fock_p02_p12_generated3.F90
+  src/gencode/fock_p02_p12_generated4.F90
+  src/gencode/fock_p02_m12_generated1.F90
+  src/gencode/fock_p02_m12_generated2.F90
+  src/gencode/fock_p02_m12_generated3.F90
+  src/gencode/fock_p02_m12_generated4.F90
+  src/gencode/fock_p11_p11_generated.F90
+  src/gencode/fock_p11_p12_generated1.F90
+  src/gencode/fock_p11_p12_generated2.F90
+  src/gencode/fock_p11_p20_generated.F90
+  src/gencode/fock_p12_p12_generated1.F90
+  src/gencode/fock_p12_p12_generated2.F90
+  src/gencode/fock_p12_p20_generated1.F90
+  src/gencode/fock_p12_p20_generated2.F90
+  src/gencode/fock_m11_m11_generated1.F90
+  src/gencode/fock_m11_m11_generated2.F90
+  src/gencode/fock_m11_m12_generated1.F90
+  src/gencode/fock_m11_m12_generated2.F90
+  src/gencode/fock_m11_m12_generated3.F90
+  src/gencode/fock_m11_m12_generated4.F90
+  src/gencode/fock_m11_m20_generated1.F90
+  src/gencode/fock_m11_m20_generated2.F90
+  src/gencode/fock_m11_m20_generated3.F90
+  src/gencode/fock_m11_m20_generated4.F90
+  src/gencode/fock_m12_m12_generated1.F90
+  src/gencode/fock_m12_m12_generated2.F90
+  src/gencode/fock_m12_m12_generated3.F90
+  src/gencode/fock_m12_m12_generated4.F90
+  src/gencode/fock_m12_m20_generated1.F90
+  src/gencode/fock_m12_m20_generated2.F90
+  src/gencode/fock_m12_m20_generated3.F90
+  src/gencode/fock_m12_m20_generated4.F90
+  src/gencode/fock_p20_p20_generated.F90
+  src/gencode/fock_m20_m20_generated1.F90
+  src/gencode/fock_m20_m20_generated2.F90
+  src/gencode/fock_m20_m20_generated3.F90
+  src/gencode/fock_m20_m20_generated4.F90
+)
+ 
+set(RELAXSE_intgen_SOURCES
+  src/gencode/aaaa_000_000_generated.F90
+  src/gencode/aaaa_p01_p01_generated1.F90
+  src/gencode/aaaa_p01_p01_generated2.F90
+  src/gencode/aaaa_p02_p02_generated1.F90
+  src/gencode/aaaa_p02_p02_generated2.F90
+  src/gencode/aaaa_p02_p02_generated3.F90
+  src/gencode/aaaa_p02_p02_generated4.F90
+  src/gencode/aaaa_p11_p11_generated.F90
+  src/gencode/aaaa_p12_p12_generated1.F90
+  src/gencode/aaaa_p12_p12_generated2.F90
+  src/gencode/aaaa_m11_m11_generated1.F90
+  src/gencode/aaaa_m11_m11_generated2.F90
+  src/gencode/aaaa_m12_m12_generated1.F90
+  src/gencode/aaaa_m12_m12_generated2.F90
+  src/gencode/aaaa_m12_m12_generated3.F90
+  src/gencode/aaaa_m12_m12_generated4.F90
+  src/gencode/aaaa_p20_p20_generated.F90
+  src/gencode/aaaa_m20_m20_generated1.F90
+  src/gencode/aaaa_m20_m20_generated2.F90
+  src/gencode/aaaa_m20_m20_generated3.F90
+  src/gencode/aaaa_m20_m20_generated4.F90
+  src/gencode/aaao_000_p11_generated.F90
+  src/gencode/aaao_p01_p12_generated1.F90
+  src/gencode/aaao_p01_p12_generated2.F90
+  src/gencode/aaao_p01_m11_generated1.F90
+  src/gencode/aaao_p01_m11_generated2.F90
+  src/gencode/aaao_p02_m12_generated1.F90
+  src/gencode/aaao_p02_m12_generated2.F90
+  src/gencode/aaao_p02_m12_generated3.F90
+  src/gencode/aaao_p02_m12_generated4.F90
+  src/gencode/aaao_p11_p20_generated.F90
+  src/gencode/aaao_m12_m20_generated1.F90
+  src/gencode/aaao_m12_m20_generated2.F90
+  src/gencode/aaao_m12_m20_generated3.F90
+  src/gencode/aaao_m12_m20_generated4.F90
+  src/gencode/vaaa_000_m11_generated1.F90
+  src/gencode/vaaa_000_m11_generated2.F90
+  src/gencode/vaaa_p01_p11_generated1.F90
+  src/gencode/vaaa_p01_p11_generated2.F90
+  src/gencode/vaaa_p01_m12_generated1.F90
+  src/gencode/vaaa_p01_m12_generated2.F90
+  src/gencode/vaaa_p01_m12_generated3.F90
+  src/gencode/vaaa_p01_m12_generated4.F90
+  src/gencode/vaaa_p02_p12_generated1.F90
+  src/gencode/vaaa_p02_p12_generated2.F90
+  src/gencode/vaaa_p02_p12_generated3.F90
+  src/gencode/vaaa_p02_p12_generated4.F90
+  src/gencode/vaaa_p12_p20_generated1.F90
+  src/gencode/vaaa_p12_p20_generated2.F90
+  src/gencode/vaaa_m11_m20_generated1.F90
+  src/gencode/vaaa_m11_m20_generated2.F90
+  src/gencode/vaaa_m11_m20_generated3.F90
+  src/gencode/vaaa_m11_m20_generated4.F90
+  src/gencode/aaoo_p01_p01_generated1.F90
+  src/gencode/aaoo_p01_p01_generated2.F90
+  src/gencode/aaoo_p02_p02_generated1.F90
+  src/gencode/aaoo_p02_p02_generated2.F90
+  src/gencode/aaoo_p02_p02_generated3.F90
+  src/gencode/aaoo_p02_p02_generated4.F90
+  src/gencode/aaoo_p11_p11_generated.F90
+  src/gencode/aaoo_p12_p12_generated1.F90
+  src/gencode/aaoo_p12_p12_generated2.F90
+  src/gencode/aaoo_m12_m12_generated1.F90
+  src/gencode/aaoo_m12_m12_generated2.F90
+  src/gencode/aaoo_m12_m12_generated3.F90
+  src/gencode/aaoo_m12_m12_generated4.F90
+  src/gencode/aaoo_p20_p20_generated.F90
+  src/gencode/vaao_000_p01_generated1.F90
+  src/gencode/vaao_000_p01_generated2.F90
+  src/gencode/vaao_p01_p02_generated1.F90
+  src/gencode/vaao_p01_p02_generated2.F90
+  src/gencode/vaao_p01_p02_generated3.F90
+  src/gencode/vaao_p01_p02_generated4.F90
+  src/gencode/vaao_p01_p20_generated1.F90
+  src/gencode/vaao_p01_p20_generated2.F90
+  src/gencode/vaao_p01_m20_generated1.F90
+  src/gencode/vaao_p01_m20_generated2.F90
+  src/gencode/vaao_p01_m20_generated3.F90
+  src/gencode/vaao_p01_m20_generated4.F90
+  src/gencode/vaao_p11_p12_generated1.F90
+  src/gencode/vaao_p11_p12_generated2.F90
+  src/gencode/vaao_p11_m11_generated1.F90
+  src/gencode/vaao_p11_m11_generated2.F90
+  src/gencode/vaao_p12_m12_generated1.F90
+  src/gencode/vaao_p12_m12_generated2.F90
+  src/gencode/vaao_p12_m12_generated3.F90
+  src/gencode/vaao_p12_m12_generated4.F90
+  src/gencode/vaao_m11_m12_generated1.F90
+  src/gencode/vaao_m11_m12_generated2.F90
+  src/gencode/vaao_m11_m12_generated3.F90
+  src/gencode/vaao_m11_m12_generated4.F90
+  src/gencode/vvaa_p01_p01_generated1.F90
+  src/gencode/vvaa_p01_p01_generated2.F90
+  src/gencode/vvaa_p02_p02_generated1.F90
+  src/gencode/vvaa_p02_p02_generated2.F90
+  src/gencode/vvaa_p02_p02_generated3.F90
+  src/gencode/vvaa_p02_p02_generated4.F90
+  src/gencode/vvaa_p12_p12_generated1.F90
+  src/gencode/vvaa_p12_p12_generated2.F90
+  src/gencode/vvaa_m11_m11_generated1.F90
+  src/gencode/vvaa_m11_m11_generated2.F90
+  src/gencode/vvaa_m12_m12_generated1.F90
+  src/gencode/vvaa_m12_m12_generated2.F90
+  src/gencode/vvaa_m12_m12_generated3.F90
+  src/gencode/vvaa_m12_m12_generated4.F90
+  src/gencode/vvaa_m20_m20_generated1.F90
+  src/gencode/vvaa_m20_m20_generated2.F90
+  src/gencode/vvaa_m20_m20_generated3.F90
+  src/gencode/vvaa_m20_m20_generated4.F90
+  src/gencode/vaoo_p01_p11_generated1.F90
+  src/gencode/vaoo_p01_p11_generated2.F90
+  src/gencode/vaoo_p01_m12_generated1.F90
+  src/gencode/vaoo_p01_m12_generated2.F90
+  src/gencode/vaoo_p01_m12_generated3.F90
+  src/gencode/vaoo_p01_m12_generated4.F90
+  src/gencode/vaoo_p02_p12_generated1.F90
+  src/gencode/vaoo_p02_p12_generated2.F90
+  src/gencode/vaoo_p02_p12_generated3.F90
+  src/gencode/vaoo_p02_p12_generated4.F90
+  src/gencode/vaoo_p12_p20_generated1.F90
+  src/gencode/vaoo_p12_p20_generated2.F90
+  src/gencode/vvao_p01_p12_generated1.F90
+  src/gencode/vvao_p01_p12_generated2.F90
+  src/gencode/vvao_p01_m11_generated1.F90
+  src/gencode/vvao_p01_m11_generated2.F90
+  src/gencode/vvao_p02_m12_generated1.F90
+  src/gencode/vvao_p02_m12_generated2.F90
+  src/gencode/vvao_p02_m12_generated3.F90
+  src/gencode/vvao_p02_m12_generated4.F90
+  src/gencode/vvao_m12_m20_generated1.F90
+  src/gencode/vvao_m12_m20_generated2.F90
+  src/gencode/vvao_m12_m20_generated3.F90
+  src/gencode/vvao_m12_m20_generated4.F90
+  src/gencode/vvoo_p01_p01_generated1.F90
+  src/gencode/vvoo_p01_p01_generated2.F90
+  src/gencode/vvoo_p02_p02_generated1.F90
+  src/gencode/vvoo_p02_p02_generated2.F90
+  src/gencode/vvoo_p02_p02_generated3.F90
+  src/gencode/vvoo_p02_p02_generated4.F90
+  src/gencode/vvoo_p12_p12_generated1.F90
+  src/gencode/vvoo_p12_p12_generated2.F90
+  src/gencode/vvoo_m12_m12_generated1.F90
+  src/gencode/vvoo_m12_m12_generated2.F90
+  src/gencode/vvoo_m12_m12_generated3.F90
+  src/gencode/vvoo_m12_m12_generated4.F90
+  src/gencode/vava_000_m20_generated1.F90
+  src/gencode/vava_000_m20_generated2.F90
+  src/gencode/vava_000_m20_generated3.F90
+  src/gencode/vava_000_m20_generated4.F90
+  src/gencode/vava_p02_p20_generated1.F90
+  src/gencode/vava_p02_p20_generated2.F90
+  src/gencode/vava_p02_p20_generated3.F90
+  src/gencode/vava_p02_p20_generated4.F90
+  src/gencode/vava_p11_m12_generated1.F90
+  src/gencode/vava_p11_m12_generated2.F90
+  src/gencode/vava_p11_m12_generated3.F90
+  src/gencode/vava_p11_m12_generated4.F90
+  src/gencode/vvvo_p01_p02_generated1.F90
+  src/gencode/vvvo_p01_p02_generated2.F90
+  src/gencode/vvvo_p01_p02_generated3.F90
+  src/gencode/vvvo_p01_p02_generated4.F90
+  src/gencode/vvvo_m11_m12_generated1.F90
+  src/gencode/vvvo_m11_m12_generated2.F90
+  src/gencode/vvvo_m11_m12_generated3.F90
+  src/gencode/vvvo_m11_m12_generated4.F90
+  src/gencode/vvva_p01_m12_generated1.F90
+  src/gencode/vvva_p01_m12_generated2.F90
+  src/gencode/vvva_p01_m12_generated3.F90
+  src/gencode/vvva_p01_m12_generated4.F90
+  src/gencode/vvva_p02_p12_generated1.F90
+  src/gencode/vvva_p02_p12_generated2.F90
+  src/gencode/vvva_p02_p12_generated3.F90
+  src/gencode/vvva_p02_p12_generated4.F90
+  src/gencode/vvva_m11_m20_generated1.F90
+  src/gencode/vvva_m11_m20_generated2.F90
+  src/gencode/vvva_m11_m20_generated3.F90
+  src/gencode/vvva_m11_m20_generated4.F90
+  src/gencode/vvvv_p02_p02_generated1.F90
+  src/gencode/vvvv_p02_p02_generated2.F90
+  src/gencode/vvvv_p02_p02_generated3.F90
+  src/gencode/vvvv_p02_p02_generated4.F90
+  src/gencode/vvvv_m12_m12_generated1.F90
+  src/gencode/vvvv_m12_m12_generated2.F90
+  src/gencode/vvvv_m12_m12_generated3.F90
+  src/gencode/vvvv_m12_m12_generated4.F90
+  src/gencode/vvvv_m20_m20_generated1.F90
+  src/gencode/vvvv_m20_m20_generated2.F90
+  src/gencode/vvvv_m20_m20_generated3.F90
+  src/gencode/vvvv_m20_m20_generated4.F90
+  src/gencode/oooo_p02_p02_generated1.F90
+  src/gencode/oooo_p02_p02_generated2.F90
+  src/gencode/oooo_p02_p02_generated3.F90
+  src/gencode/oooo_p02_p02_generated4.F90
+  src/gencode/oooo_p12_p12_generated1.F90
+  src/gencode/oooo_p12_p12_generated2.F90
+  src/gencode/oooo_p20_p20_generated.F90
+  src/gencode/vovo_000_p02_generated1.F90
+  src/gencode/vovo_000_p02_generated2.F90
+  src/gencode/vovo_000_p02_generated3.F90
+  src/gencode/vovo_000_p02_generated4.F90
+  src/gencode/aooo_p01_p12_generated1.F90
+  src/gencode/aooo_p01_p12_generated2.F90
+  src/gencode/aooo_p02_m12_generated1.F90
+  src/gencode/aooo_p02_m12_generated2.F90
+  src/gencode/aooo_p02_m12_generated3.F90
+  src/gencode/aooo_p02_m12_generated4.F90
+  src/gencode/aooo_p11_p20_generated.F90
+  src/gencode/vavo_000_m12_generated1.F90
+  src/gencode/vavo_000_m12_generated2.F90
+  src/gencode/vavo_000_m12_generated3.F90
+  src/gencode/vavo_000_m12_generated4.F90
+  src/gencode/vavo_p02_p11_generated1.F90
+  src/gencode/vavo_p02_p11_generated2.F90
+  src/gencode/vavo_p02_p11_generated3.F90
+  src/gencode/vavo_p02_p11_generated4.F90
+  src/gencode/vooo_p01_p02_generated1.F90
+  src/gencode/vooo_p01_p02_generated2.F90
+  src/gencode/vooo_p01_p02_generated3.F90
+  src/gencode/vooo_p01_p02_generated4.F90
+  src/gencode/vooo_p11_p12_generated1.F90
+  src/gencode/vooo_p11_p12_generated2.F90
+  src/gencode/aoao_000_p20_generated.F90
+  src/gencode/aoao_p02_m20_generated1.F90
+  src/gencode/aoao_p02_m20_generated2.F90
+  src/gencode/aoao_p02_m20_generated3.F90
+  src/gencode/aoao_p02_m20_generated4.F90
+  src/gencode/aoao_p12_m11_generated1.F90
+  src/gencode/aoao_p12_m11_generated2.F90
+  src/gencode/voao_000_p12_generated1.F90
+  src/gencode/voao_000_p12_generated2.F90
+  src/gencode/voao_p02_m11_generated1.F90
+  src/gencode/voao_p02_m11_generated2.F90
+  src/gencode/voao_p02_m11_generated3.F90
+  src/gencode/voao_p02_m11_generated4.F90
+)
diff --git a/cmake/RelaxSE_prop.cmake b/cmake/RelaxSE_prop.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..71bbc0b72f6bbbcec3c47e2173e4e7888b72422a
--- /dev/null
+++ b/cmake/RelaxSE_prop.cmake
@@ -0,0 +1,7 @@
+set(RELAXSE_SOURCES_prop
+  src/proprietes.F90 
+  src/lect_data_prop.F90
+  src/def_files_prop.F90	
+  src/init_prop.F90
+  src/info_prop.F90
+  )
diff --git a/cmake/Test_Sources.cmake b/cmake/Test_Sources.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..9eeca9c97120d06fbe9111e1c4690f93f87d103c
--- /dev/null
+++ b/cmake/Test_Sources.cmake
@@ -0,0 +1,13 @@
+set(UNITTEST_SOURCES
+  test/vector.f90
+  test/test_connect.f90
+  test/detact_test.f90
+  test/deter_test.f90
+  test/diag_test.f90
+  test/gener_ref.f90
+  test/gener_ref2.f90
+  test/gener_ref11211.f90
+  test/gener_ref11211_uu.f90
+  test/gener_ref44422.f90
+  test/hole_part_cases_test.f90
+  )
diff --git a/cmake/TestsRelaxSE.cmake b/cmake/TestsRelaxSE.cmake
new file mode 100644
index 0000000000000000000000000000000000000000..64ccc18a50b3b4625fc693fbaf90875ad400fd99
--- /dev/null
+++ b/cmake/TestsRelaxSE.cmake
@@ -0,0 +1,66 @@
+#Run through each source
+foreach(testSrc ${UNITTEST_SOURCES})
+  #Extract the filename without an extension (NAME_WE)
+  get_filename_component(testName ${testSrc} NAME_WE)
+  
+  #Add compile target
+  add_executable(${testName} ${testSrc})
+	
+  #link to Boost libraries AND your targets and dependencies
+  target_link_libraries(${testName}
+    RelaxSE_lib
+    RelaxSE_type
+    RelaxSE_IO
+    RelaxSE_common
+    #test_utils
+    ${LAPACK_LIBRARIES}
+    ${BLAS_LIBRARIES})
+  
+  #I like to move testing binaries into a testBin directory
+  set_target_properties(${testName} PROPERTIES 
+    RUNTIME_OUTPUT_DIRECTORY  ${CMAKE_BINARY_DIR}/testBin)
+  
+  #Finally add it to test execution - 
+  #Notice the WORKING_DIRECTORY and COMMAND
+  add_test(NAME ${testName} 
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/testBin 
+    COMMAND ${CMAKE_BINARY_DIR}/testBin/${testName} )
+endforeach(testSrc)
+
+macro(add_runtest _name)
+  add_test(
+    NAME ${_name}
+    COMMAND python3 ${CMAKE_SOURCE_DIR}/test/${_name}/test --binary-dir=${CMAKE_BINARY_DIR} --work-dir=${CMAKE_BINARY_DIR}/test/${_name} --verbose --log=${CMAKE_BINARY_DIR}/test/${_name}/runtest.stderr.log)
+  #if(NOT "${_labels}" STREQUAL "")
+  set_tests_properties(${_name} PROPERTIES
+    RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/test/${_name})
+  #endif()
+endmacro()
+add_runtest(CuO_20204)
+add_runtest(CuO_20204_spin)
+add_runtest(CuO_20240)
+add_runtest(CuO_02204)
+add_runtest(CuO_00800_HS)
+add_runtest(CuO_00800_LS)
+if(NOT ENABLE_NOGEN)
+  add_runtest(CuO_02240)
+  add_runtest(CuO_30405)
+  add_runtest(CuO_03450_nodet2)
+  add_runtest(CuO_03450_nodet3)
+  add_runtest(CuO_03450_nocontraction)
+  add_runtest(CuO_03450_allcontraction)
+  add_runtest(CuO_03450)
+  add_runtest(CuO_12423)
+  add_runtest(CuO_CAS+S)
+  add_runtest(CuO_DDCI)
+  add_test(NAME prop 
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/test/CuO_DDCI
+    COMMAND ${CMAKE_BINARY_DIR}/prop.x )
+endif()
+
+if(ENABLE_MPI)
+  add_runtest(CuO_03450_bigbatch_MPIload)
+  add_runtest(CuO_03450_bigbatch_noMPIload)
+  add_runtest(CuO_03450_smallbatch_MPIload)
+  add_runtest(CuO_03450_smallbatch_noMPIload)
+endif()
diff --git a/configure b/configure
new file mode 100755
index 0000000000000000000000000000000000000000..d94e70001813a6e888809cc8655dd80205451143
--- /dev/null
+++ b/configure
@@ -0,0 +1,238 @@
+#!/usr/bin/env python3
+
+import os
+import sys
+import string
+import re
+import subprocess
+import shutil
+import datetime
+from argparse import ArgumentParser
+
+sys.path.append('cmake')
+
+if sys.version < '3.4':
+    print('requires python version >= 3.4')
+    print('current version',sys.version)
+    sys.exit(1)
+
+root_directory = os.path.dirname(os.path.realpath(__file__))
+default_path = os.path.join(root_directory, 'build')
+src_path = os.path.join(root_directory, 'src')
+
+def parse_input():
+    '''
+    Parse input 
+    here only the build directory is given but could be extended 
+    '''
+    parser = ArgumentParser(description="setup build configurations")
+
+    parser.add_argument('builddir', nargs='?',
+            action='store',
+            default=default_path,
+            help='build directory [default: %(default)s]',
+            metavar='build path')
+    
+    # Basic compiler options
+    group = parser.add_argument_group('basic options')
+    group.add_argument('--fc',
+            action='store',
+            default=None,
+            help='set the Fortran compiler [default: pick automatically or based on FC=...]',
+            metavar='STRING')
+    group.add_argument('--cc',
+            action='store',
+            default=None,
+            help='set the C compiler [default: pick automatically or based on CC=...]',
+            metavar='STRING')
+    group.add_argument('--cxx',
+            action='store',
+            default=None,
+            help='set the C++ compiler [default: pick automatically or based on CXX=...]',
+            metavar='STRING')
+
+    group.add_argument('--gnu',
+            action='store_true',
+            default=False,
+            help='select the gnu compilers')
+
+    group.add_argument('--intel',
+            action='store_true',
+            default=False,
+            help='select the intel compilers')
+    
+    group.add_argument('--show',
+            action='store_true',
+            default=False,
+            help='show cmake command and exit [default: %(default)s]')
+    
+    group.add_argument('--cmake',
+            action='store',
+            default='cmake',
+            help='set the cmake command [default: cmake; e.g. --cmake cmake28]',
+            metavar='STRING')
+    
+    # Build type (release, debug or profiling)
+
+    group = parser.add_argument_group('release, debug, opt or profile')
+    group.add_argument('--build-type',
+            action='store',
+            default='Release',
+            help='build type (Opt, Release, Debug, or Profile) [default: %(default)s]',
+            metavar='STRING')
+    group.add_argument('--nogen',
+            action='store_true',
+            default=False,
+            help='disable generated code [default: %(default)s]')
+    
+    group = parser.add_argument_group('parallelization')
+    group.add_argument('--mpi',
+            action='store_true',
+            default=False,
+            help='enable MPI [default: %(default)s]')
+    group.add_argument('--omp',
+            action='store_true',
+            default=False,
+            help='enable OpenMP [default: %(default)s]')
+  
+
+    return parser.parse_args()
+
+def check_cmake_exists(cmake_command):
+    p = subprocess.Popen('%s --version' % cmake_command,
+            shell=True,
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            universal_newlines=True)
+    if not ('cmake version' in p.communicate()[0]):
+        print('   This code is built using CMake')
+        print('')
+        print('   CMake is not found')
+        print('   1) on some clusters CMake is installed')
+        print('      but you have to load it first:')
+        print('      $ module load cmake')
+        print('   2) if not, get CMake at http://www.cmake.org/')
+        sys.exit()
+
+def translate_cmake(s):
+    if s:
+        return 'ON'
+    else:
+        return 'OFF'
+        
+def gen_cmake_command(args):
+    # create cmake command from flags
+
+    command = ''
+
+    if args.fc:
+        command += ' FC=%s'  % args.fc
+    if args.cc:
+        command += ' CC=%s'  % args.cc
+    if args.cxx:
+        command += ' CXX=%s'  % args.cxx
+
+    if args.gnu:
+        if args.mpi:
+            # command += ' -DCMAKE_C_COMPILER=`which gcc` -DCMAKE_CXX_COMPILER=`which g++` -DCMAKE_Fortran_COMPILER=`which gfortran`'
+            command += ' CC=`which gcc` CXX=`which g++` FC=`which gfortran`'
+        else:
+            command += ' CC=`which gcc` CXX=`which g++` FC=`which gfortran`'
+
+    if args.intel:
+        if args.mpi:            
+            command += ' CC=`which icc` CXX=`which icpc` FC=`which ifort`'
+        else:
+            command += ' CC=`which icc` CXX=`which icpc` FC=`which ifort`'
+
+    command += ' %s' % args.cmake
+
+    if args.intel:
+        if args.mpi:
+            command += ' -DMPI_C_COMPILER=`which mpiicc` -DMPI_CXX_COMPILER=`which mpiicpc` -DMPI_Fortran_COMPILER=`which mpiifort`'
+
+    command += ' -DENABLE_MPI=%s'            % translate_cmake(args.mpi)
+    command += ' -DENABLE_OMP=%s'            % translate_cmake(args.omp)
+    command += ' -DENABLE_NOGEN=%s'          % translate_cmake(args.nogen)
+               
+    if args.build_type:
+        command += ' -DCMAKE_BUILD_TYPE=%s' % args.build_type
+
+    command += ' %s' % root_directory
+
+    print('%s\n' % command)
+    if args.show:
+        sys.exit()
+    return command
+
+def print_build_help(build_path):
+    print('   configure step is done')
+    print('   now you need to compile the sources:')
+    if (build_path == default_path):
+        print('   $ cd build')
+    else:
+        print('   $ cd ' + build_path)
+    print('   $ make')
+
+def save_setup_command(argv, command, build_path):
+    file_name = os.path.join(build_path, 'setup_command')
+    f = open(file_name, 'w')
+    f.write('# setup command was executed '+datetime.datetime.now().strftime("%d-%B-%Y %H:%M:%S"+"\n"))
+    f.write(" ".join(argv[:])+"\n")
+    f.write("\n# cmake command generated by this setup command was: \n")
+    f.write("# "+command+"\n")
+    f.close()
+
+    
+def setup_build_path(build_path):
+    if os.path.isdir(build_path):
+        fname = os.path.join(build_path, 'CMakeCache.txt')
+        if os.path.exists(fname):
+            print('aborting setup - build directory %s which contains CMakeCache.txt exists already' % build_path)
+            print('remove the build directory and then rerun setup')
+            sys.exit(1)
+    else:
+        #shutil.copytree(src_path, build_path)
+        os.makedirs(build_path, mode = 0o755)
+
+def run_cmake(command, build_path):
+    topdir = os.getcwd()
+    os.chdir(build_path)
+    p = subprocess.Popen(command,
+            shell=True,
+            stdin=subprocess.PIPE,
+            stdout=subprocess.PIPE,
+            universal_newlines=True)
+    s = p.communicate()[0]
+    # print cmake output to screen
+    print(s)
+    # write cmake output to file
+    f = open('setup_cmake_output', 'w')
+    f.write(s)
+    f.close()
+    # change directory and return
+    os.chdir(topdir)
+    return s
+
+
+def main(argv):
+    print("Running configure")
+    args = parse_input()
+    check_cmake_exists(args.cmake)
+    build_path = args.builddir
+    print("Build directory:" + args.builddir)
+    if not args.show:
+        setup_build_path(build_path)
+    command = gen_cmake_command(args)
+    status = run_cmake(command, build_path)
+
+    if 'Configuring incomplete' in status:
+        print("Configure incomplete")
+       
+    else:
+        # configuration was successful
+        save_setup_command(argv, command, build_path)
+        print_build_help(build_path)
+
+if __name__ == '__main__':
+    main(sys.argv)
diff --git a/src/RelaxSE.F90 b/src/RelaxSE.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e87b99bd0780dcd30ef9401def89377e981d3d09
--- /dev/null
+++ b/src/RelaxSE.F90
@@ -0,0 +1,469 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!> @file Main for the RelaxSE program
+!> @author Marie-Bernadette Lepetit and Elisa Rebolini
+
+Program RelaxSE
+
+
+!!$ -------- Donness globales ---------------------------------
+  use info
+  use detact
+  use spindetact
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  use fockmatrix
+  use gener_guess
+  use integrales
+  use SASS_diag
+  use hole_part_cases
+  use explicit_Hmat
+  use utils_wrt
+
+#ifndef VAR_NOGEN
+  use codegen_hdiag
+#endif
+
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+
+  type(g_infotype)    :: g_info
+  type(prog_infotype) :: prog_info
+  type(o_infotype)    :: o_info
+  type(ord_infotype)  :: ord_info
+  type(v_infotype)    :: v_info
+  type(det_infotype)  :: det_info
+  type(ener_infotype) :: ener_info
+  type(int_infotype)  :: int_info
+  type(david_infotype):: bdav_info
+  type(sym_infotype)  :: sym_info
+  
+  type(deter), dimension(:), allocatable :: ref0, det
+
+  Real (KIND=kd_dble), dimension(:),   allocatable :: Hdiag
+  Real (KIND=kd_dble), dimension(:,:), allocatable :: fock, hcoeur, h0, Hmat
+  Real (KIND=kd_dble), dimension(:,:), allocatable :: psi_0_guess, psi_SASS
+    
+  type(case_infotype), allocatable :: hole_case_info(:), part_case_info(:)
+
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  type(spindetact_list), pointer :: r0
+  type(deter_dblocklist) :: d
+
+  real(kd_dble) :: hij_test
+
+  Integer (KIND=kd_int) :: nvec_restart, nd00
+  Integer (KIND=kd_int) :: i, j, idet, jdet
+  real(kd_dble) :: tstart, tend, t1, t2, wstart, wend, wstart1, wend1
+
+  CHARACTER(LEN=8)     :: date      ! returned values from DATE_AND_TIME()
+  CHARACTER(LEN=10)    :: time
+  CHARACTER(LEN=5)     :: zone
+  INTEGER,DIMENSION(8) :: values 
+
+  integer :: nb_thread
+
+  logical :: lprop
+  
+#ifdef VAR_MPI
+  integer :: ierr
+  
+  call mpi_init(ierr)
+#endif
+
+  call gettime(tstart, wstart)
+  
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Initialisations 
+!!$-----
+  ! Initialisations des variables
+  
+  call init(g_info, prog_info, o_info, v_info, &
+       det_info, ener_info, int_info, bdav_info, sym_info)
+
+  prog_info%tstart = tstart
+  prog_info%wstart = wstart
+  
+#ifdef VAR_MPI
+  !Get the nb of CPUs and the rank of the current one
+  call mpi_comm_size(MPI_COMM_WORLD, prog_info%nb_cpu, ierr)
+  call mpi_comm_rank(MPI_COMM_WORLD, prog_info%id_cpu, ierr)
+#endif
+
+#ifdef VAR_OMP
+  !$OMP PARALLEL SHARED(nb_thread)
+  nb_thread=OMP_GET_MAX_THREADS()
+  !$OMP END PARALLEL
+
+  prog_info%nb_thread = nb_thread
+#endif
+ 
+  !Definition des fichiers
+  call def_files(prog_info)
+  
+  ! Lectures infos MOLCAS +  donnees SASS
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*) ("--", i=1,50)
+     write(f_output,*)">>> Reading input data"
+     write(f_output,*) ("--", i=1,50)
+  endif
+  call lect_data(g_info, prog_info, o_info, v_info, det_info, &
+       ener_info, bdav_info, sym_info)
+  if (prog_info%id_cpu.eq.0) then
+     flush(f_output)
+  endif
+
+  
+  ! Calcul de tableurs d'ordre des orbitales Molcas <-> SASS
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*) ("--", i=1,50)
+     write(f_output,*)">>> Preparations "
+     write(f_output,*) ("--", i=1,50)
+     write(f_output,*)">>> Orbital re-ordering Molcas <-> RelaxSE"
+     flush(f_output)
+  end if
+  call orb_ordering(prog_info, ord_info, o_info, g_info)
+  if (prog_info%id_cpu.eq.0) flush(f_output)
+
+  ! Lecture des ref0
+  if (prog_info%id_cpu.eq.0) then
+     if (prog_info%methodAct.eq.'cas') then
+        write(f_output,*)
+        write(f_output,*)">>> Ref0 = CAS"
+     else
+        write(f_output,*)
+        write(f_output,*)">>> Reading Ref0"
+        write(f_output,'(a25,":",i4)') "  Nb of read ref0       ",&
+             det_info%nref0
+     end if
+  end if
+
+
+  ! Initialisation ref0 and active determinant lists R
+  if (prog_info%methodAct.eq.'cas') then
+     det_info%nref0 = comb(o_info%nact,g_info%na) * comb(o_info%nact,g_info%nb)
+     call deter_init(ref0, det_info%nref0)
+     call gener_cas(ref0, prog_info, det_info, g_info, o_info)
+  else
+     call deter_init(ref0, det_info%nref0)
+     call lect_ref0(ref0, prog_info, det_info, g_info, o_info, v_info)
+  end if
+  if (prog_info%id_cpu.eq.0)  flush(f_output)
+
+  
+  call detact_all_init(r, nb_rlist)  
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*)">>> Generation of all determinants"
+     flush(f_output)
+  endif
+  call gettime(t1,wstart1)
+  ! Calcul des conf de spin des ref0
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  ! Calcul des conf de spin des ref1
+  call generspin_ref1(ref0, r, o_info, det_info, g_info%nelact, prog_info)
+  call deter_free(ref0)
+
+  !If this is the first time that the calculation is launched then write the dets
+  !are saved for the prop.x otherwise this is not needed.
+  lprop = .false.
+  if (.not. prog_info%restart) then 
+     if (prog_info%id_cpu.eq.0) then
+        lprop = .true.
+     endif
+  endif
+  
+  ! Generation of all active determinants
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  ! Generation of all determinants   
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, o_info, v_info, prog_info, lprop)
+  call gettime(t2,wend1)
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*) '>>>Determinants generated in',t2-t1,'second(s)'
+     flush(f_output)
+  endif
+
+  if (lprop) then
+     write(f_output,*)
+     call wrt_info(prog_info,g_info,o_info,v_info,det_info,d,sym_info,f_info)
+     write(f_output,*)">>> x_info written on file"
+     flush(f_info)
+     flush(f_output)
+     write(f_output,*)
+     call deter_init(det,det_info%ndet)
+     call fill_detd(det, d)
+     call wrt_bdet(det,det_info%ndet,f_bdet)
+     write(f_output,*)">>> Determinants written on file"
+     flush(f_output)  
+     flush(f_bdet)
+     call deter_free(det)
+  endif
+
+  !Initialisation of the bare h matrix
+  ! contains ntot * ntot elements
+  ! their indices run from ngel+1 to ngel+ntot  
+  allocate(hcoeur(o_info%ngel+1: o_info%ngel+o_info%ntot, &
+       o_info%ngel+1 : o_info%ngel+o_info%ntot))
+  hcoeur(:,:) = 0.d0
+
+  ! Lecture des integrales
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*)">>> Lecture des integrales TraOne et TraInt"
+     flush(f_output)
+  endif
+  call gettime(t1,wstart1)
+  call lect_int(hcoeur, g_info, prog_info, o_info, ord_info, ener_info, &
+       int_info, f_output)
+  call gettime(t2,wend1)
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*) '>>> Integrals read in',t2-t1,'second(s)'
+     flush(f_output)
+  endif
+
+#ifdef VAR_MPI
+  call MPI_BARRIER(MPI_COMM_WORLD,ierr)
+#endif
+     
+  !Build the fock matrix
+  !Add the 2e- part to the bare h_pq
+  !f_pq = h_pq + sum[ 2(ij|oo) - (io|jo)]
+  !where o runs on both the occ and ligo
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*)">>> Construction of the Fock matrix"
+  endif
+
+  call gettime(t1,wstart1)
+  allocate(fock(o_info%ngel+1 : o_info%ngel+o_info%ntot, &
+       o_info%ngel+1 : o_info%ngel+o_info%ntot))
+  fock(:,:) = 0.d0
+  call build_fock(fock, hcoeur, o_info, int_info, prog_info)
+  !call diag_fock(fock, o_info)
+  call gettime(t2,wend1)
+
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*) '>>> Fock matrix built in',t2-t1,'second(s)' 
+     write(f_output,*)
+     flush(f_output)
+  endif
+  call get_e0(ener_info, hcoeur, o_info, int_info, prog_info)
+  
+!-----
+!----- Diag 0 
+!-----
+
+  allocate(hdiag(det_info%ndet))
+#ifdef VAR_NOGEN
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*) &
+          ">>> Construction of the diagonal of the Hamiltonian matrix"
+     flush(f_output)
+     call gettime(t1,wstart1)
+  endif
+  call build_hdiag(hdiag, rspin, d, hcoeur, fock, o_info, int_info, &
+       ener_info%ecoeur, g_info%nelact, v_info%sz, prog_info)
+  if (prog_info%id_cpu.eq.0) then
+     call gettime(t2,wend1)
+     write(f_output,'(X,A,F12.6,A)',advance='no') &
+          '>>> Hdiag built in CPU time:',t2-t1,' second(s)'
+     write(f_output,'(X,A,F12.6,A)')' Wall time:', &
+          wend1-wstart1,' second(s)'
+     flush(f_output)
+  endif
+#else
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*) &
+          ">>> Construction of the diagonal of the Hamiltonian matrix (gen)"
+     call gettime(t1,wstart1)
+  endif
+  call build_hdiag_gen(hdiag, rspin, d, fock, o_info, int_info, &
+       g_info%nelact, prog_info)
+  if (prog_info%id_cpu.eq.0) then
+     call gettime(t2,wend1)
+     write(f_output,'(X,A,F12.6,A)',advance='no') &
+          '>>> Hdiag(gen) built in CPU time:',t2-t1,' second(s)'
+     write(f_output,'(X,A,F12.6,A)')' Wall time:', &
+          wend1-wstart1,' second(s)'
+     flush(f_output)
+  endif
+#endif
+  deallocate(hcoeur)
+  
+  
+       
+  !Compute the D00-D00 block to find a good guess or restart from previous calc.
+  if (.not. prog_info%restart) then 
+     if (prog_info%id_cpu.eq.0) then
+        write(f_output,*)
+        write(f_output,*) ("--", i=1,50)
+        write(f_output,*) '>>> Calculation of guess vectors'
+        write(f_output,*) ("--", i=1,50)
+        write(f_output,*) '>>> Build the matrix H0=<D00|H|D00>'
+        call gettime(t1,wstart1)
+        flush(f_output)
+     endif
+     r0 => rspin%l(1)%p  
+     call compute_h0(h0, r0, d, fock, hdiag, g_info, o_info, ord_info, &
+          int_info, v_info%sz, prog_info) 
+     nd00 = d%detblock(1)%p%ndet 
+     call diag_h0(h0, psi_0_guess, nd00, ener_info, v_info%nvec, prog_info)   
+     
+     if (prog_info%id_cpu.eq.0) then
+        call gettime(t2,wend1)
+        write(f_output,*) '>>> H0 diagonalised in',t2-t1,'second(s)'
+        flush(f_output)
+     endif
+     deallocate(h0)
+  else
+     r0 => rspin%l(1)%p
+     call lect_guess(psi_0_guess, det_info%ndet, v_info%nvec, nvec_restart, &
+          bdav_info%iter0, ener_info%potnuc, ener_info%Ecoeur)
+     if (nvec_restart.lt.v_info%nvec) &
+          call complement_guess(psi_0_guess, det_info%ndet, v_info%nvec, nvec_restart, r0, d, &
+          fock, hdiag, g_info, o_info, ord_info, int_info, v_info%sz, ener_info, prog_info)
+  end if
+
+
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*) ("--", i=1,50)
+     write(f_output,*) '>>> Diagonalisation'
+     write(f_output,*) ("--", i=1,50)
+     flush(f_output)
+  endif
+
+  if (prog_info%lexplicit) then
+     call generspin_det(det_info, rspin, d, o_info, v_info, prog_info, .true.)
+     call deter_init(det,det_info%ndet)
+     call fill_detd(det, d)
+
+     if (prog_info%lreadHmat) then
+        call read_hmat_from_file(Hmat, det_info%ndet, v_info%nvec, prog_info)
+     endif
+     
+     open(60)
+     open(61)
+     do idet = 1, det_info%ndet
+        do jdet = 1, det_info%ndet
+           hij_test = explicit_Hij(&
+                Idet, Jdet,&
+                det, fock, hdiag, g_info, prog_info, &
+                o_info, int_info, v_info, ener_info, 60)
+           if (prog_info%lreadHmat) then
+              write(61,*) idet, jdet, hij_test, Hmat(idet,jdet), Hij_test-Hmat(idet,jdet)
+           else
+              write(61,*) idet,jdet,Hij_test
+           endif
+           flush(60)
+           flush(61)
+        enddo
+     enddo
+     close(61)
+     close(60)
+     call deter_free(det)
+     if (prog_info%lreadHmat) then
+        deallocate(Hmat)
+     endif
+  else
+  
+     !-----
+     !----- Diag SAS+S
+     !-----
+     
+     allocate(hole_case_info(num_cases))
+     allocate(part_case_info(num_cases))
+     call gener_hole_case_info(hole_case_info) 
+     call gener_part_case_info(part_case_info, g_info%nelact)
+     
+     allocate(psi_SASS(det_info%ndet, v_info%nvec))
+     call diag_sass(psi_0_guess, psi_SASS, fock, hdiag, rspin, d, &
+          prog_info, o_info, int_info, v_info, g_info%nelact, det_info%ndet, &
+          hole_case_info, part_case_info, bdav_info,  ener_info)
+     if ((prog_info%id_cpu.eq.0).and.(prog_info%iprint.eq.10)) then
+        call wrtmat(psi_SASS, det_info%ndet, det_info%ndet, v_info%nvec, f_output)  
+     end if
+
+     deallocate(psi_SASS)
+     deallocate(hole_case_info)
+     deallocate(part_case_info)
+ 
+  endif
+  flush(f_output)
+     
+!!$-----
+!!$----- Sorties
+!!$-----
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_blocklist_free(d)
+  deallocate(fock)
+  deallocate(hdiag)
+  deallocate(psi_0_guess)
+  
+ 
+  deallocate(vecref0)
+  deallocate(orb_info)
+  call info_free(g_info, prog_info, o_info, ord_info, v_info, &
+       det_info, ener_info, int_info, bdav_info, sym_info)
+
+  call gettime(tend,wend)
+  
+  if (prog_info%id_cpu.eq.0) then
+     call date_and_time(date, time, zone, values)
+     write(f_output,'(X,A,F17.2,A,F17.2,A)') 'Calculation finished in CPUtime',&
+          tend-tstart,'s Walltime:', &
+          wend-wstart,'s'
+     
+     write(f_output,*) 'Calculation finished on ', date(7:8),'-',date(5:6),&
+          '-',date(1:4), ' at ', time(1:2),':',time(3:4)
+  endif
+#ifdef VAR_MPI
+    call mpi_finalize(ierr)
+#endif
+  End Program RELAXSE
+
+
+
+!!$==========================================================================
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/RelaxSE_diag.F90 b/src/RelaxSE_diag.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5e0406166cedac1f2ad53c527bffbcfdf65d707b
--- /dev/null
+++ b/src/RelaxSE_diag.F90
@@ -0,0 +1,1358 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module SASS_diag
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_ortho
+  use utils_intcase
+  use typetargetvec
+  use compute_hv
+  use sort
+  
+  implicit none
+  
+contains
+  
+  !$======================================================================== 
+  !> @brief Iterative diagonalisation of the SASS
+  !> @author MB Lepetit
+  !> @date June 2018
+  !
+  !> @param psi in input Guess vectors coming from the exact diag
+  !> @param psi in output final vectors
+  !! of <D00|H|D00>
+  !> @param psi_SASS Target states
+  !> @param fock Fock matrix in the AO basis
+  !> @param hdiag Diagonal elms of the Hamiltonian matrix
+  !> @param rspin List of the spin-ordered active parts of the determinants
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param v_info Info on the target states
+  !> @param nelact Nb of active electrons
+  !> @param ndet Total number of determinants
+  !$======================================================================== 
+  subroutine diag_sass(psi_0_guess, psi_SASS, fock, hdiag, rspin, det, prog_info, &
+       o_info, int_info, v_info, nelact, ndet, hcase_info, pcase_info, bdav_info, &
+       ener_info)
+!!$
+!!$ Vm(idet,ivec,icol)   : vecteur correction du vecteur ivec 
+!!$                         du block icol sur le det idet
+!!$ Wm(idet,ivec,icol)   : H*Vm
+!!$ H_dav                : Hamiltonien effectif sur les vecteurs Vm
+!!$                        H_dav(i,j) = Vm(i)*H*Vm(j)
+!!$
+
+    real(kd_dble), parameter :: mev=27211.386245988d0, epsilon=1.d-12, num_epsilon=1.d-15
+
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: psi_0_guess
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: psi_SASS
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+    real(kd_dble), dimension(:), allocatable, intent(in)      :: hdiag
+    type(spinrlist), intent(in)                :: rspin
+    type(deter_dblocklist), intent(in)         :: det
+    type(prog_infotype), intent(in)            :: prog_info
+    type(o_infotype), intent(in)               :: o_info  
+    type(int_infotype), intent(in)             :: int_info
+    type(v_infotype), intent(in)               :: v_info
+    type(david_infotype), intent(in)           :: bdav_info
+    type(ener_infotype), intent(inout)         :: ener_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: ndet
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, nd00, sz, nvec
+    integer :: nconv, nvectot
+    integer :: Sizeheff, Dimheff, NitDavid, iter0
+    integer, dimension(:), allocatable :: vconv ! vecteurs convergés
+    real(kd_dble) :: Ecoeur, potnuc
+    real(kd_dble) :: tol_orth, tol_norm, tol_conv
+    real(kd_dble), dimension(:,:,:), allocatable :: Vm, Wm
+    real(kd_dble), dimension(:,:), allocatable   :: S, Vect, H_dav, Hmat
+    real(kd_dble), dimension(:), allocatable :: ener
+    real(kd_dble), dimension(:), allocatable :: Ener_np1, deltaE, etmp
+
+#ifdef VAR_NOGEN
+    real(kd_dble), dimension(:), allocatable   :: Emat
+    real(kd_dble), dimension(:,:), allocatable :: Vmat
+    integer :: info
+#endif
+    
+    integer :: ivec, jvec, kvec, iter, ish, jsh, i, j
+    integer :: ncol, icol, jcol, idet
+
+    integer :: nguess
+    integer :: iconv, nbre_col
+    real(kd_dble) :: tmp, t1, ostart
+    logical :: clef, conv_ener
+
+    type(intkind_H), dimension(:), allocatable :: intkindlist
+    type(int_blockpair_list) :: mpilist
+    integer :: sizebatch
+
+    logical :: debugdav 
+    integer :: fdav = 666 !file id for debugdav printing
+
+    debugdav = bdav_info%debug_dav
+    open(666)
+    open(667)
+    
+    ngel     = o_info%ngel
+    nocc     = o_info%nocc
+    nligo    = o_info%nligo
+    nact     = o_info%nact
+    nligv    = o_info%nligv
+    nvirt    = o_info%nvirt
+    nd00     = det%detblock(1)%p%ndet
+    sz       = v_info%sz
+    nvectot  = v_info%nvec
+    Sizeheff = bdav_info%Sizeheff
+    NitDavid = bdav_info%NitDavid
+    tol_orth = bdav_info%tol_orth 
+    tol_norm = bdav_info%tol_norm
+    tol_conv = bdav_info%tol_conv
+    conv_ener= bdav_info%conv_ener
+    iter0    = bdav_info%iter0
+    iter     = 0
+    potnuc   = ener_info%potnuc
+    Ecoeur   = ener_info%Ecoeur    
+
+#ifdef VAR_NOGEN
+    if (debug) then
+       allocate(Hmat(ndet,ndet))
+    endif
+#else
+    allocate(Hmat(1,1))
+#endif
+
+#ifdef VAR_MPI
+    sizebatch = prog_info%sizebatch
+#else
+    sizebatch = max(1,nligv+nvirt)
+#endif
+
+    
+    call get_mpiblockpair_list(mpilist, sizebatch, nligv+nvirt)
+
+
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,*)
+       write(f_output,*)&
+            "================================================================="
+       write(f_output,*) ">>> Davidson Diagonalisation "
+       write(f_output,'(A,I0,A,ES8.1)') "   Search for ",nvectot,&
+            " vectors with a convergence threshold of ",sqrt(tol_conv)
+       write(f_output,*)
+       call gettime(t1,ostart)
+       write(f_output,'(A,F12.4,A)') 'Total Elapsed tWall ', ostart-prog_info%wstart,'s'
+
+       write(f_output, '(A,I0,A)') 'Particles are divided in batches of ', sizebatch
+    endif
+
+    if (debugdav) then 
+       write(fdav,*) "Guess vectors"
+       do idet = 1, nd00
+          write(fdav,*) (psi_0_guess(idet,ivec), ivec = 1,nvectot)
+       enddo
+       write(fdav,*)
+    end if
+
+!!$ allocations |Vm> et H|Vm> = |Wm> et initialisation des vecteurs
+    allocate(Vm(ndet, nvectot, Sizeheff))
+    allocate(Wm(ndet, nvectot, Sizeheff))
+    
+    Vm(:,:,:)     = 0.d0
+    Wm(:,:,:)     = 0.d0
+    psi_SASS(:,:) = 0.d0
+    ! Initialisation de la première colonne de Heff
+    ! aux nvectot vecteurs d'essai donnés  sur les nd00 premiers déterminants
+    if (prog_info%restart) then
+       nguess = ndet
+    else
+       nguess = nd00
+    endif
+    Vm(1:nguess,1:nvectot,1)     = psi_0_guess(1:nguess,1:nvectot)
+    psi_SASS(1:nguess,1:nvectot) = psi_0_guess(1:nguess,1:nvectot) 
+
+!!$ Orthogonormalite des vecteurs d'essai
+    call orthonorm(Vm(1,1,1),ndet,nvectot,tol_orth,tol_norm,.false.,prog_info)
+    
+  
+!!$ Davidson iterations ------------------------------------------------
+    ! Initialisations 
+    Dimheff  = nvectot*(Sizeheff +1)  !  dimension Heff de Davidson
+    
+    allocate(vect(Dimheff,Dimheff))
+    allocate(ener(nvectot))
+    allocate(ener_np1(Dimheff))
+    allocate(etmp(nvectot),deltaE(nvectot))
+    allocate(vconv(nvectot)) ! numéro des vecteurs convergés
+    allocate(H_dav(Dimheff,Dimheff))
+    
+    H_dav(:,:)  = 0.d0   ! Heff de Davidson       
+    vect(:,:)   = 0.d0   ! vecteurs pp de H_dav
+    ener(:)     = 0.d0   ! valeurs pp H_dav
+    ener_np1(:) = 0.d0   ! valeurs pp H_dav iteration N+1
+    deltaE(:)   = 0.d0   ! E(n)-E(n-1)
+    etmp(:)     = 0.d0   ! energies temporaires   
+    vconv(:)    = 0
+
+    nconv = 0
+    ncol  = 1
+    nvec  = nvectot
+
+    !Fock and Integrals
+    call intkind_H_all_init(intkindlist, int_info)
+       
+
+    if (prog_info%id_cpu.eq.0) then
+#ifdef VAR_MPI
+       write(f_output,'(X,A6,X,A12,X,A12,X,A12,2X,A)') &
+            '#Iter', 'tallCPU (s)', 'tCPU0 (s)', 'tWall0 (s)', "Energies"
+       write(*,*) '#tCPU (s) : tWall (s) : tCPU/tWall : intkind : DblockI : DblockJ : spin'
+#else
+       write(f_output,'(X,A6,X,A12,X,A12,2X,A)') '#Iter', 'tCPU (s)', 'tWall (s)', "Energies"
+       write(667,*) '#tCPU (s) : tWall (s) : tCPU/tWall : intkind : DblockI : DblockJ : spin'
+#endif
+    endif
+    !----------------------------------------------------------------------------------------------
+    daviter: do iter = 1, NitDavid !---------------------------------------------------------------
+
+       call david_iter(H_dav, ener, ener_np1, deltaE, vect, psi_SASS, &
+            Vm, Wm, Dimheff, ncol, fock, hdiag, rspin, &
+            det, o_info, int_info, v_info, prog_info, nelact, ndet, nvec, nconv, &
+            hcase_info, pcase_info, bdav_info, ener_info, Hmat, intkindlist, mpilist, iter)
+
+       if (prog_info%iprintHmat .gt. 0) goto 902      
+          
+       ! On teste la convergence sur les energies
+       if (conv_ener) then
+          tmp = 0.d0
+          if ((iter > 2).and.(ncol >1)) then
+             do ivec = 1,nvec
+                if (abs(Ener_np1(ivec)-Ener(ivec+nconv)).gt.tmp) &
+                     tmp = abs(Ener_np1(ivec)-Ener(ivec+nconv))
+             end do
+             if (tmp.lt.tol_conv*tol_conv) then
+                if (prog_info%id_cpu.eq.0) then
+                   write(f_output,*) "   "  
+                   write(f_output,'(A,ES8.1,A)') " >>> Davidson procedure converged in energy at", &
+                        tol_conv*tol_conv,  " <<<" 
+                endif
+                ! On met à jour Ener
+                Ener(1+nconv:nvectot) = Ener_np1(1:nvec)
+                nconv = nconv + nvec
+                goto 900 !convergence
+             end if
+          end if
+       end if
+
+       ! On met à jour Ener
+       Ener(1+nconv:nvectot) = Ener_np1(1:nvec)
+
+       ! Sauvegarde des vecteurs pour restart 
+       rewind(f_restart)
+       write(f_restart) nvectot,ndet,nconv, iter+iter0
+       write(f_restart) Ecoeur,PotNuc
+       write(f_restart) (ener(ivec), ivec =1,nvectot)
+       do ivec = 1,nvectot
+          write(f_restart) (psi_SASS(idet,ivec),idet=1,ndet)
+       end do
+       flush(f_restart)
+
+       ! Si a on atteint Sizeheff alors on contracte tout sur les premiers vecteurs
+       !  (une colonne)
+       if (ncol.ge.Sizeheff) then 
+          Vm(:,:,:) = 0.d0
+          Wm(:,:,:) = 0.d0
+          do ivec=1,nvec
+             Vm(1:ndet,ivec,1) = psi_SASS(1:ndet,ivec+nconv)
+          end do
+          ncol = 1
+          if (prog_info%id_cpu.eq.0) then
+             write(f_output,*) " >>> On contracte <<<"
+          endif
+          cycle
+       end if
+
+       ! Sinon Calcul du nouveau vecteur de correction : (HV-EV)/(Ej-Hii) -> Vm(ncol+1)
+       ncol = ncol + 1
+       if (debugdav) then 
+          write(fdav,*) " vecteurs HV de l'iteration :", iter+iter0
+          call wrtmat(Wm, ndet, min(10,ndet), nvec*ncol, fdav)
+          write(fdav,*)
+          write(fdav,*) " vecteurs V de l'iteration :", iter+iter0
+          call wrtmat(Vm, ndet, min(10,ndet), nvec*ncol, fdav)
+          write(fdav,*)
+          write(fdav,*) " vecteurs vect de l'iteration :", iter+iter0
+          call wrtmat(vect, Dimheff, nvec*ncol, nvec*ncol, fdav)
+          write(fdav,*)
+       end if
+       Vm(:,:,ncol)  = 0.d0
+       if (debugdav)  write(fdav,*) " ncol =",ncol
+       do ivec = 1,nvec
+          do jcol = 1, ncol-1
+             jsh = (jcol-1)*nvec
+             do jvec = 1, nvec
+                Vm(1:ndet,ivec,ncol) = Vm(1:ndet,ivec,ncol) + &
+                     Vect(jvec+jsh,ivec)*&
+                     (Wm(1:ndet,jvec,jcol) - Ener_np1(ivec)*Vm(1:ndet,jvec,jcol))
+             end do
+          end do
+          if (debugdav) then
+             write(fdav,*) " vecteurs HV-EV de l'iteration :", iter+iter0, " vecteur ",ivec
+             call wrtmat(Vm(1,ivec,ncol), ndet, min(10,ndet), 1, fdav)
+             write(fdav,*)
+          end if
+          do idet = 1,ndet
+             if (abs(Ener_np1(ivec) - Hdiag(idet)).lt.epsilon) cycle
+             Vm(idet,ivec,ncol) = Vm(idet,ivec,ncol)/(Ener_np1(ivec) - Hdiag(idet))
+          end do
+       end do
+       if (debugdav) then
+          write(fdav,*) " vecteurs (HV-EV)/(E-Hii) de l'iteration :", iter+iter0
+          call wrtmat(Vm(1,1,ncol), ndet, min(ndet,10), nvec, fdav)
+          write(fdav,*)
+       end if
+
+       if (ndet.eq.1) goto 900
+       ! Orthonormalisation des nouveaux vecteurs corrections 
+       ! schmidt avec les vecteurs converges
+       ! OK car ncol Vm(ndet,*,ncol) psi_SASS(ndet,*)
+       call orthog_Schmidt(Vm(1,1,ncol),psi_SASS(1,1),ndet,nvec,nconv,tol_orth)
+       ! schmidt avec anciens non convergés
+       ! OK  car ncol Vm(ndet,*,ncol) et icol Vm(ndet,*,icol)
+       do icol = 1,ncol-1
+          call orthog_Schmidt(Vm(1,1,ncol),Vm(1,1,icol),ndet,nvec,nvec,tol_orth)
+       end do
+       if (debugdav) then
+          write(fdav,*) " vecteurs (HV-EV)/(E-Hii) de l'iteration apres othonorm:", iter+iter0
+          call wrtmat(Vm(1,1,ncol), ndet, min(10,ndet), nvec, fdav)
+          write(fdav,*)
+          flush(fdav)
+       end if
+
+       ! convergence sur vecteurs corrections puis
+       ! normalisation, reorthogonalisation renormalisation
+       clef=.false.
+       iconv = 0
+       vconv(:) = 0
+       do ivec = 1,nvec
+          tmp = dot_product(Vm(1:ndet,ivec,ncol),Vm(1:ndet,ivec,ncol))
+          if ((tmp.lt.tol_conv) .and. (iter>2) ) then ! vecteur converge
+             clef=.true.
+             iconv = iconv + 1
+             vconv(iconv) = ivec
+          else ! on normalise et continue
+             !if (tmp .gt. num_epsilon) then !to avoid dividing by 0 when there is only one vector
+             tmp = 1.d0/sqrt(tmp) ! on normalise 
+             Vm(1:ndet,ivec,ncol) = Vm(1:ndet,ivec,ncol)*tmp
+             !endif
+          end if
+       end do
+       !  reorthogonalisation et renormalisation
+       call orthog_Schmidt(Vm(1,1,ncol),psi_SASS(1,1),ndet,nvec,nconv,tol_orth)
+       do icol = 1,ncol-1
+          call orthog_Schmidt(Vm(1,1,ncol),Vm(1,1,icol),ndet,nvec,nvec,tol_orth)
+       end do
+       if (clef) goto 202 ! si au moins 1 vecteur converge
+
+       if (debugdav) then
+          call orthonorm(Vm(1,1,ncol),ndet,nvec,tol_orth,tol_norm,.true.,prog_info, fdav)
+       else
+          call orthonorm(Vm(1,1,ncol),ndet,nvec,tol_orth,tol_norm,.false.,prog_info)
+       endif
+          
+
+       cycle  ! si pas de vecteur convergé on continue
+
+       ! Si un vecteur est converge on l'enlève et on contracte 
+       !  attention à l'ordre des vecteurs
+202    continue
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,*)' The vectors ',vconv(1:iconv),' seem converged : we take them out'
+          if (nconv.ne.0) write(f_output,9001) iter+iter0, ncol, nconv+iconv, nvec-iconv
+       end if
+       ! Si tous les vecteurs ont convergés
+       if (nconv+iconv.eq.nvectot) then
+          if (prog_info%id_cpu.eq.0) then
+             write(f_output,*) "   "
+             write(f_output,'(A,ES8.1,A)') " >>> Davidson procedure converged on vectors corrections at", &
+                  tol_conv,  " <<<"
+             !write(f_output,*) "   "
+          endif
+          nconv = nconv+iconv
+          goto 900 !convergence
+       end if
+       ! s'il reste des vecteurs à trouver
+       do ivec = 1,iconv
+          Vm(1:ndet,ivec,1) = psi_SASS(1:ndet,vconv(ivec)+nconv)
+          Ener_np1(ivec)    = Ener(vconv(ivec)+nconv)
+          etmp(ivec)        = deltaE(vconv(ivec)+nconv)
+       end do
+       do ivec = iconv, 1, -1
+          ! je fait une place en nconv+1
+          do jvec=vconv(ivec)-1, 1, -1
+             psi_SASS(1:ndet,1+jvec+nconv) = psi_SASS(1:ndet,jvec+nconv)
+             Ener(1+jvec+nconv)   = Ener(jvec+nconv)
+             deltaE(1+jvec+nconv)   = etmp(jvec+nconv)
+          end do
+          ! je mets le nouveau vecteur converge en nconv+1
+          psi_SASS(1:ndet,nconv+1)  =  Vm(1:ndet,ivec,1)  
+          Ener(nconv+1)             =  Ener_np1(ivec)
+          deltaE(nconv+1)           =  etmp(ivec)
+          nconv = nconv + 1
+          nvec  = nvec  - 1
+       end do
+       ncol  = 1
+       Vm(:,:,:) = 0.d0
+       Ener_np1(:) = 0.d0
+       do jvec = 1,nvec
+          Vm(1:ndet,jvec,ncol) = psi_SASS(1:ndet,nconv+jvec)
+          Ener_np1(jvec) = Ener(nconv+jvec)
+       end do
+
+    end do daviter
+!!$  Fin iterations de Davidson ----------------------------------- 
+
+
+!!$ Sortie sans convergence
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,*) "   "  
+       write(f_output,*) ">>> No convergence after  ", iter+iter0-1, " iterations <<<" 
+       write(f_output,*) "   "
+       flush(f_output)
+    endif
+    goto 901
+
+!!$ Sortie convergé    
+900 continue ! convergé
+    if (prog_info%id_cpu.eq.0) then
+       !write(f_output,*) "   "  
+       write(f_output,*) ">>> Convergence reached after ", iter+iter0-1, " iterations <<<" 
+       write(f_output,*) "   "
+       flush(f_output)
+    endif
+    goto 901
+
+!!$ On met tout en ordre    
+901 continue
+    ! Réordonne les vecteurs pp
+    do ivec = 1,nvectot
+       vconv(ivec) = ivec
+    end do
+    do ivec = 1,nvectot
+       do jvec = ivec+1,nvectot
+          if (Ener(vconv(jvec)).lt.Ener(vconv(ivec))) then
+             kvec = vconv(ivec)
+             vconv(ivec) = vconv(jvec)
+             vconv(jvec) = kvec
+          end if
+       end do
+    end do
+    Ener_np1(1:nvectot)    = Ener(1:nvectot)
+    Vm(1:ndet,1:nvectot,1) = psi_SASS(1:ndet,1:nvectot)
+    etmp(1:nvectot)        = deltaE(1:nvectot)
+    do ivec = 1,nvectot
+       Ener(ivec)  = Ener_np1(vconv(ivec)) 
+       psi_SASS(1:ndet,ivec) = Vm(1:ndet,vconv(ivec),1)
+       deltaE(ivec) = etmp(vconv(ivec)) 
+    end do
+
+    ! ecriture sur restart
+    rewind(f_restart)
+    write(f_restart) nvectot,ndet,nconv, iter+iter0
+    write(f_restart) Ecoeur,PotNuc
+    write(f_restart) (ener(ivec), ivec =1,nvectot)
+    do ivec = 1,nvectot
+       write(f_restart) (psi_SASS(idet,ivec),idet=1,ndet)
+    end do
+    flush(f_restart)
+
+
+!!$ Calcul du vecteur erreur || Hu -Eu||
+    Wm(:,:,:)    = 0.d0
+    Ener_np1(:)  = 0.d0
+    !if (.not.debugmat) then
+#ifdef VAR_MPI
+    if ((prog_info%id_cpu.eq.0).and.(prog_info%iprint.gt.0)) then
+       write(*,*) ''
+       write(*,*) '>>>> Compute error'
+       write(*,*) ''
+    endif
+#endif
+    
+       call compute_HVm(psi_SASS, Wm(1,1,1), fock, hdiag, rspin, det, o_info, &
+            int_info, prog_info, nelact, ndet, nvectot, &
+            hcase_info, pcase_info, Hmat, intkindlist, mpilist, iter)
+    !else
+    !   write (6,*) ' >>> debugmat <<<'
+    !   call compute_HVm_mat(psi_SASS, Wm(1,1,1), det, ndet, nvectot, Hmat)
+    !end if
+    do ivec = 1,nvectot
+       etmp(ivec) = dot_product(psi_SASS(1:ndet,ivec),Wm(1:ndet,ivec,1))
+    end do
+    do ivec = 1,nvectot
+       Wm(:,ivec,2) =  Wm(:,ivec,1)  - Ener(ivec)*psi_SASS(:,ivec)
+    end do
+    do ivec = 1,nvectot
+       Ener_np1(ivec) = dot_product(Wm(:,ivec,2),Wm(:,ivec,2))
+       Ener_np1(ivec) = sqrt(Ener_np1(ivec))
+    end do
+
+!!$ Calcul orthogonormalite des vecteurs finaux
+    allocate (S(nvectot,nvectot))
+    S(:,:) = 0.d0
+    do jvec = 1,nvectot
+       S(jvec,jvec)  = dot_product(psi_SASS(1:ndet,jvec),psi_SASS(1:ndet,jvec)) -1.d0
+       do ivec = 1,jvec-1
+          S(ivec,jvec)  = dot_product(psi_SASS(1:ndet,ivec),psi_SASS(1:ndet,jvec))
+          S(jvec,ivec)  = S(ivec,jvec)
+       end do
+    end do
+    write (f_output,*) " Overlap matrix between final vectors (difference to Id) "
+    call wrtmatE(S, nvectot, nvectot, nvectot, f_output)
+    write (f_output,*)
+    deallocate(S)
+
+!!$ ecriture sur sortie
+    nbre_col = 5
+    icol = nvectot/nbre_col
+    jvec = nvectot -  icol*nbre_col
+    if (prog_info%id_cpu.eq.0) then
+       if (icol.eq.0) then
+          write(f_output,9004) (Ener(ivec)+Ecoeur+Potnuc, ivec=1,jvec)
+          write(f_output,9007) (Ener(ivec), ivec=1,jvec)
+          write(f_output,9009) ((Ener(ivec)-Ener(1)), ivec=1,jvec)
+          write(f_output,9008) ((Ener(ivec)-Ener(1))*mev, ivec=1,jvec)
+          write(f_output,9005) (Ener_np1(ivec), ivec=1,jvec)
+          write(f_output,9010) (deltaE(ivec), ivec=1,jvec)
+          ! write(f_output,9006) (Etmp(ivec)-Ener(ivec), ivec=1,jvec)
+          write(f_output,*)
+       else
+          do jcol = 1,icol
+             ish = (jcol-1)*nbre_col
+             write(f_output,9004) (Ener(ivec)+Ecoeur+Potnuc, ivec=1+ish,nbre_col+ish)
+             write(f_output,9007) (Ener(ivec), ivec=1+ish,nbre_col+ish)
+             write(f_output,9009) ((Ener(ivec)-Ener(1)), ivec=1+ish,nbre_col+ish)
+             write(f_output,9008) ((Ener(ivec)-Ener(1))*mev, ivec=1+ish,nbre_col+ish)
+             write(f_output,9005) (Ener_np1(ivec), ivec=1+ish,nbre_col+ish)
+             write(f_output,9010) (deltaE(ivec), ivec=1+ish,nbre_col+ish)
+             ! write(f_output,9006) (Etmp(ivec)-Ener(ivec), ivec=1+ish,nbre_col+ish)
+             write(f_output,*)
+          end do
+          if (jvec.ne.0) then
+             ish = icol*nbre_col
+             write(f_output,9004) (Ener(ivec)+Ecoeur+Potnuc,  ivec=1+ish,jvec+ish)
+             write(f_output,9007) (Ener(ivec), ivec=1+ish,jvec+ish)
+             write(f_output,9009) ((Ener(ivec)-Ener(1)), ivec=1+ish,jvec+ish)
+             write(f_output,9008) ((Ener(ivec)-Ener(1))*mev, ivec=1+ish,jvec+ish)
+             write(f_output,9005) (Ener_np1(ivec),  ivec=1+ish,jvec+ish)
+             write(f_output,9010) (deltaE(ivec),  ivec=1+ish,jvec+ish)
+             ! write(f_output,9006) (Etmp(ivec)-Ener(ivec), ivec=1+ish,jvec+ish)
+             write(f_output,*)
+          end if
+       end if
+    endif
+    write(f_output,'(" Maximum precision expected on |Hv-Ev|   : ", D8.1)') sqrt(max(tol_orth,tol_norm))
+    write(f_output,'(" Maximum precision expected on <v|H|v>-E : ", D8.1)') max(tol_orth,tol_norm)
+
+    write(f_output,*)
+
+
+
+
+#ifdef VAR_NOGEN
+    if (debug) then
+
+       allocate(Vmat(ndet,ndet), Emat(ndet))
+       Vmat(:,:) = 0.d0
+       Emat(:) = 0.d0
+       info = 0
+       !write(f_output,*) " verif 3"
+       call diag(Hmat,Emat,Vmat,ndet,3,f_output,info)
+       !do i=1,2
+       !   write(f_output,*) Vmat(:,i)
+       !end do
+
+       ! Calcul du vecteur erreur || Hu -Eu||
+       Wm(:,:,1)    = 0.d0
+       Ener_np1(:)  = 0.d0
+       do ivec =1, nvectot
+          do j = 1,ndet
+             do i = 1,ndet
+                Wm(i,ivec,1) = Wm(i,ivec,1) + Hmat(i,j)*Vmat(j,ivec)
+             end do
+          end do
+       end do
+       do ivec = 1,nvectot
+          etmp(ivec) = dot_product(Vmat(1:ndet,ivec),Wm(1:ndet,ivec,1))
+       end do
+       do ivec = 1,nvectot
+          Wm(:,ivec,1) =  Wm(:,ivec,1)  - Emat(ivec)*Vmat(:,ivec)
+       end do
+       do ivec = 1,nvectot
+          Ener_np1(ivec) = dot_product(Wm(:,ivec,1),Wm(:,ivec,1))
+          Ener_np1(ivec) = sqrt(Ener_np1(ivec))
+       end do
+       write(f_output,*) " Hv a la main"
+       do i= 1,nvectot
+          write(f_output,*) 'Vp Hmat, |Hv-Ev|, <v|H|v>-E' , i, Emat(i),  Ener_np1(i), etmp(i)- Emat(i)
+       end do
+       write(f_output,*) 
+
+       ! Calcul du vecteur erreur || Hu -Eu||
+       Wm(:,:,1)    = 0.d0
+       Ener_np1(:)  = 0.d0
+       call compute_HVm(Vmat, Wm, fock, hdiag, rspin, det, o_info, &
+            int_info, prog_info, nelact, ndet, nvectot, hcase_info, pcase_info, &
+            Hmat, intkindlist, mpilist, iter)
+       do ivec = 1,nvectot
+          etmp(ivec) = dot_product(Vmat(1:ndet,ivec),Wm(1:ndet,ivec,1))
+       end do
+       do ivec = 1,nvectot
+          Wm(:,ivec,1) =  Wm(:,ivec,1)  - Emat(ivec)*Vmat(:,ivec)
+       end do
+       do ivec = 1,nvectot
+          Ener_np1(ivec) = dot_product(Wm(:,ivec,1),Wm(:,ivec,1))
+          Ener_np1(ivec) = sqrt(Ener_np1(ivec))
+       end do
+       write(f_output,*) " Hv avec compute_HVm"
+       do i= 1,nvectot
+          write(f_output,*) 'Vp Hmat, |Hv-Ev|, <v|H|v>-E' , i, Emat(i),  Ener_np1(i), etmp(i)- Emat(i)
+       end do
+       deallocate(Vmat,Emat)
+
+    endif
+#endif
+
+
+!!$ On nettoie et ferme
+902 deallocate(Vm,Wm)
+    deallocate(H_dav,vect)
+    deallocate(Ener_np1,Etmp,vconv)
+    call intkind_H_all_free(intkindlist)
+
+    deallocate(mpilist%l)
+    deallocate(mpilist%indx)
+    deallocate(mpilist%cputime)
+    deallocate(mpilist%wtime)
+
+    deallocate(Hmat) 
+    close(f_restart)
+    close(f_mat)
+    close(f_mat2)
+    close(f_bmat)
+    close(666)
+    close(667)
+
+    !Save energies
+    !allocate(ener_info%ener(nvectot))
+    ener_info%ener(:) = ener(:)
+    deallocate(ener)
+
+!!$ Formats    
+9001 format("-- Davidson' iteration:",i5,"  ncol=",i3, " Nbre of converged vectors:",i3,&
+         " Nbre of remaining  vectors:",i3)
+9004 format(1x,"Energies : ",5(f22.15,2x))
+9005 format(1x,"|Hv-Ev|  : ",5(ES22.4E2,2x))
+9006 format(1x,"<vHv>-E  : ",5(ES22.4E2,2x))
+9007 format(1x,"E ss ref : ",5(f22.15,2x))
+9008 format(1x,"dE (meV) : ",5(f22.15,2x))
+9009 format(1x,"dE (a.u.): ",5(f22.15,2x))
+9010 format(1x,"deltaE   : ",5(ES22.4E2,2x))
+
+  end subroutine diag_sass
+
+  !$========================================================================
+  !> @brief One Davidson iteration step
+  !> @author MB Lepetit & E Rebolini
+  !> @date June 2018
+  !
+  !> @param[inout] H_dav      Hamiltonien effectif sur les vecteurs Vm
+  !!                          H_dav(i,j) = Vm(i)*H*Vm(j)
+  !> @param[inout] ener       Array to store the iteration energies
+  !> @param[inout] ener_np1   Array to store the N+1 iteration energies
+  !> @param[inout] deltaE     Array to store the energy difference E(n)-E(n-1)
+  !> @param[inout] vect       Eigenvectors oh Hdav
+  !> @param[inout] psiSASS    Target states
+  !> @param[in]    Vm
+  !> @param[inout] Wm
+  !> @param[in]    DimHeff    Size of the effective Hamiltanian H_dav
+  !!                          nvectot*(Sizeheff +1) 
+  !> @param[inout] ncol       
+  !> @param[in]    fock       Fock matrix in the AO basis
+  !> @param[in]    hdiag      Diagonal elms of the Hamiltonian matrix
+  !> @param[in]    rspin      List of the spin-ordered active parts of the determinants
+  !> @param[in]    det        List of blocks of determinants D_m^n
+  !> @param[in]    o_info     Orbital information
+  !> @param[in]    int_info   Integral information
+  !> @param[in]    v_info     Info on the target states
+  !> @param[in]    prog_info  
+  !> @param[in]    nelact     Nb of active electrons
+  !> @param[in]    ndet       Total number of determinants
+  !> @param[in]    nvec       Nb of vectors in the currect iteration
+  !!                          <= nvectot the nb of target vectors
+  !> @param[in]    nconv      nb of converged vectors
+  !> @param[in]    hcase_info
+  !> @param[in]    pcase_info
+  !> @param[in]    bdav_info
+  !> @param[in]    ener_info
+  !> @param[in]    Hmat
+  !> @param[in]    intkindlist
+  !> @param[in]    mpilist
+  !> @param[in]    iter
+  !$======================================================================== 
+  subroutine david_iter(H_dav, ener, ener_np1, deltaE, vect, psi_SASS, &
+       Vm, Wm, Dimheff, ncol, fock, hdiag, rspin, &
+       det, o_info, int_info, v_info, prog_info, nelact, ndet, nvec, nconv, &
+       hcase_info, pcase_info, bdav_info, ener_info, Hmat, intkindlist, mpilist, iter)
+
+    real(kd_dble), dimension(:,:), allocatable, intent(inout)   :: H_dav
+    real(kd_dble), dimension(:), allocatable, intent(inout)     :: ener, ener_np1, deltaE
+    real(kd_dble), dimension(:,:), allocatable, intent(inout)   :: vect
+    real(kd_dble), dimension(:,:), allocatable, intent(inout)   :: psi_SASS
+    real(kd_dble), dimension(:,:,:), allocatable, intent(in)    :: Vm
+    real(kd_dble), dimension(:,:,:), allocatable, intent(inout) :: Wm
+    integer, intent(in)                                         :: Dimheff, nconv
+    integer, intent(inout)                                      :: ncol
+    real(kd_dble), dimension(:,:), allocatable, intent(in)      :: fock
+    real(kd_dble), dimension(:), allocatable, intent(in)        :: hdiag
+    type(spinrlist), intent(in)                :: rspin
+    type(deter_dblocklist), intent(in)         :: det
+    type(prog_infotype), intent(in)            :: prog_info
+    type(o_infotype), intent(in)               :: o_info  
+    type(int_infotype), intent(in)             :: int_info
+    type(v_infotype), intent(in)               :: v_info
+    type(david_infotype), intent(in)           :: bdav_info
+    type(ener_infotype), intent(in)            :: ener_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: ndet, nvec
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable :: Hmat
+    type(intkind_H), dimension(:), allocatable :: intkindlist
+    type(int_blockpair_list), intent(inout)    :: mpilist
+    integer, intent(in)                        :: iter
+
+    real(kd_dble) :: t1, ostart, t2, oend, totalcputime
+    real(kd_dble) :: hij
+    real(kd_dble) :: Ecoeur, potnuc
+    integer :: nsh, ivec, jvec, icol, jcol
+    integer :: iout, ish, jsh, iter0, nvectot
+    integer :: fdav = 667 !file id for debugdav printing
+    integer :: i,j
+    !integer :: kcol, ksh, kvec
+    logical :: debugdav 
+#ifdef VAR_MPI
+    integer :: info
+#endif
+
+    real(kd_dble), dimension(:), allocatable     :: Enertmp, etmp
+    real(kd_dble), dimension(:,:), allocatable   :: davtmp, vecttmp
+
+    debugdav = bdav_info%debug_dav
+
+    iter0    = bdav_info%iter0
+    potnuc   = ener_info%potnuc
+    Ecoeur   = ener_info%Ecoeur
+    nvectot  = v_info%nvec
+
+
+
+#ifdef VAR_MPI
+    if ((prog_info%id_cpu.eq.0).and.(prog_info%iprint.gt.0)) then
+       write(*,*) ''
+       write(*,*) '>>>> Iteration', iter
+       write(*,*) ''
+    endif
+    call MPI_Barrier(  MPI_COMM_WORLD, info)
+    if (((prog_info%restart) .and. (iter .eq. 2)) .or. &
+         ((.not.prog_info%restart) .and. (iter .eq. 3))) then
+
+       if (prog_info%nb_cpu .ne. 1) then
+          if (prog_info%mpi_load_balance) then
+             call sort_mpi_timings(mpilist, det, prog_info, iter)
+          endif
+       endif
+    endif
+#endif
+
+    call gettime(t1,ostart)
+
+    Wm(:,:,ncol)=0.d0
+
+    !  Calcul de W = H * V  cad |W_m^J> = H_JI |V_m^I>
+    call compute_HVm(Vm(1,1,ncol), Wm(1,1,ncol), fock, hdiag, rspin, &
+         det, o_info, int_info, prog_info, nelact, ndet, nvec, &
+         hcase_info, pcase_info, Hmat, intkindlist, mpilist, iter)
+
+#ifdef VAR_NOGEN
+    if (prog_info%iprintHmat .gt. 0) then
+
+       write(f_bmat) Hmat
+       flush(f_bmat)
+       write(f_output, *) '>>> Hmat written to binary file prefix.bmat'
+
+       if (prog_info%iprintHmat .gt.1) then
+          write(f_mat,*) ndet
+          do i = 1, ndet
+             write(f_mat,*) Hmat(i,:)
+          enddo
+          write(f_mat,*) ''
+          write(f_mat,*) ndet
+          flush(f_mat)
+          write(f_output, *) '>>> Hmat written to text file prefix.mat'
+
+          if (prog_info%iprintHmat .gt.2) then
+             do i = 1, ndet
+                do j=1, ndet
+                   write(f_mat2,*) i,j,Hmat(i,j)
+                enddo
+             enddo
+             flush(f_mat2)
+             write(f_output, *) '>>> Hmat written to text file prefix.mat with explicit indices'
+          endif
+       endif
+       call check_hermiticity(Hmat,ndet)
+    endif
+#endif
+
+    ! Calcul de l'Hamiltonien effectif  H_dav
+    ! bloc iteration iter -> <Vm(ivec,ncol)|H|Vm(jvec,ncol)> 
+    nsh = (ncol-1)*nvec
+    do ivec = 1,nvec
+       do jvec = 1,ivec
+          hij= 0.d0 
+          hij = dot_product(Vm(1:ndet,ivec,ncol),Wm(1:ndet,jvec,ncol))
+          H_dav(ivec+nsh,jvec+nsh) = hij
+          H_dav(jvec+nsh,ivec+nsh) = hij
+       end do
+    end do
+
+    ! bloc iteration iter -> <Vm(ivec,jcol)|H|Vm(jvec,ncol)>  avec jcol < ncol
+    do jcol = 1, ncol-1
+       jsh = (jcol-1)*nvec
+       do jvec = 1,nvec
+          do ivec = 1,nvec
+             hij= 0.d0
+             hij = dot_product(Vm(1:ndet,jvec,jcol),Wm(1:ndet,ivec,ncol))
+             H_dav(ivec+nsh,jvec+jsh) = hij
+             H_dav(jvec+jsh,ivec+nsh) = hij
+          end do
+       end do
+    end do
+
+    if (debugdav) then
+       write(fdav,*) "H_dav de l'iteration :", iter+iter0, ncol, nvec
+       call wrtmat(H_dav,Dimheff,nvec*ncol, nvec*ncol, fdav)
+       write(fdav,*)
+    endif
+
+    ! si iter=1 ecrire l'énergie des vecteurs d'essais
+    if (iter.eq.1) then
+       do ivec = 1, nvec
+          ener(ivec) = H_dav(ivec,ivec)
+       end do
+       if (prog_info%id_cpu.eq.0) then
+          call gettime(t2,oend)
+#ifdef VAR_MPI
+          call wrt_ener_mpi(Ener,Ecoeur+Potnuc,nvec,0,f_output, 0.d0, 0.d0, 0.d0)
+#else
+          call wrt_ener(Ener,Ecoeur+Potnuc,nvec,0,f_output, 0.d0, 0.d0)
+#endif
+          flush(f_output)
+       endif
+    end if
+
+    ! Diagonalisation de H_dav
+    Ener_np1(:) = 0.d0 !Energies N+1
+    Vect(:,:)   = 0.d0  !Eigenvectors of Davidson Heff
+    iout        = 0 
+
+    allocate(davtmp(nvec*ncol,nvec*ncol))
+    allocate(vecttmp(nvec*ncol,nvec*ncol))
+    allocate(enertmp(nvec*ncol))
+
+    davtmp(:,:) = 0.d0
+    vecttmp(:,:) = 0.d0
+    enertmp(:) = 0.d0
+
+    do ivec = 1, nvec*ncol
+       do jvec = 1, nvec*ncol
+          davtmp(ivec, jvec) = H_dav(ivec, jvec)
+       enddo
+    enddo
+
+    call diag(davtmp,Enertmp,Vecttmp,ncol*nvec,prog_info%idiag,fdav,iout)
+
+    !vecttmp : rotation matrix in between the Vm vectors
+    !should be unitary
+    Vect(1:nvec*ncol,1:nvec*ncol) = Vecttmp(1:nvec*ncol,1:nvec*ncol)
+    Ener_np1(1:nvec*ncol) = enertmp(1:nvec*ncol)
+    deltaE(1+nconv:nvectot) =  Ener_np1(1:nvec)-Ener(1+nconv:nvectot)
+
+
+    deallocate(davtmp)
+    deallocate(Vecttmp)
+    deallocate(enertmp)
+
+    if (debugdav) then
+       if (prog_info%id_cpu .eq. 0) &
+            write(fdav,*) ">>> vecteurs vect de l'iteration :", iter + iter0
+       call wrtmat(Vect,Dimheff,nvec*ncol,nvec*ncol, fdav)
+    end if
+
+
+    ! On ecrit les energies
+    call gettime(t2,oend)
+
+    if (prog_info%id_cpu.eq.0) then
+#ifdef VAR_MPI
+       totalcputime = sum(mpilist%cputime(:))
+       !if (debugdav) then
+       call wrt_ener_mpi(Ener_np1,Ecoeur+Potnuc,nvec,iter+iter0,f_output, totalcputime, &
+            t2-t1, oend-ostart, deltaE(nconv+1:nvectot))
+       !else
+       !   call wrt_ener_mpi(Ener_np1,Ecoeur+Potnuc,nvec,iter+iter0,f_output, totalcputime, t2-t1, oend-ostart)
+       !endif
+#else
+       totalcputime = t2-t1
+       !if (debugdav) then
+       call wrt_ener(Ener_np1,Ecoeur+Potnuc,nvec,iter+iter0,f_output, totalcputime, &
+            oend-ostart, deltaE(nconv+1:nvectot))
+       !else
+       !   call wrt_ener(Ener_np1,Ecoeur+Potnuc,nvec,iter+iter0,f_output, totalcputime, oend-ostart)
+       !endif
+
+#endif
+       flush(f_output)
+    endif
+    if (debugdav) call wrt_ener(Ener_np1,0.d0,nvec,iter+iter0,fdav)
+
+    ! On met à jour psi_SASS
+    do jvec = 1,nvec 
+       psi_SASS(1:ndet,jvec+nconv) = 0.d0
+       do icol = 1,ncol
+          ish = (icol-1)*nvec
+          do ivec = 1,nvec
+             psi_SASS(1:ndet,jvec+nconv) = psi_SASS(1:ndet,jvec+nconv) &
+                  + Vect(ivec+ish,jvec)*Vm(1:ndet,ivec,icol)
+          end do
+       end do
+    end do
+
+    if (debugdav) then 
+       write(fdav,*) " vecteurs psi_SASS  de l'iteration :", iter+iter0, &
+            " nvec = ", nconv+1,nconv+nvec," ncol =", ncol
+       call wrtmat(psi_SASS,ndet,min(ndet,10),nvectot, fdav)
+       write(fdav,*)
+       allocate(vecttmp(ndet,nvectot))
+       allocate(etmp(nvectot))
+       etmp(:) = 0.d0
+       vecttmp(:,:) = 0.d0
+       call compute_HVm(psi_SASS(1,1), vecttmp(1,1), fock, hdiag, rspin, &
+            det, o_info, int_info, prog_info, nelact, ndet, nvec, &
+            hcase_info, pcase_info, Hmat, intkindlist, mpilist, iter)
+       do ivec = 1,nvectot
+          etmp(ivec) =  dot_product(psi_SASS(1:ndet,ivec),vecttmp(1:ndet,ivec))
+       end do
+       write(fdav,*)
+       write(fdav,*) " Energies PSI_SASS a it ", iter+iter0
+       call wrt_ener(Etmp,Ecoeur+Potnuc,nvectot,iter+iter0,fdav)
+       call wrt_ener(Ener_np1,Ecoeur+Potnuc,nvectot,iter+iter0,fdav)
+       write(fdav,*)"===="
+       deallocate(vecttmp)
+       deallocate(etmp)
+    end if
+
+  end subroutine david_iter
+  
+  !$======================================================================== 
+  !> @brief wrt_ener 
+  !> @author MBL
+  !> @date July 2018
+  !
+  !> @param[in] Ener(1:nvec) energies to be printed
+  !> @param[in] iter Davidson iteration
+  !> @param[in] File on which the energies will be printedDavidson iteration
+  !$======================================================================== 
+  subroutine wrt_ener(Ener,Esh,nvec,iter,file,time, walltime, deltaE)
+    Integer, intent(in) :: nvec,iter,file
+    real(kd_dble), dimension(nvec), intent(in) :: Ener
+    real(kd_dble), dimension(nvec), optional, intent(in) :: deltaE
+    real(kd_dble),  intent(in) :: Esh
+    real(kd_dble), optional :: time, walltime
+    
+    Integer :: nbre_col, icol, jcol, ish, ivec, jvec 
+
+    nbre_col = 5
+    icol = nvec/ nbre_col
+    jvec = nvec -  icol*nbre_col
+    if (present(time)) then
+       if (.not.(present(walltime))) walltime = time
+
+       !less than 5 energies, only one row
+       if (icol.eq.0) then 
+          write(file,9003) iter, time, walltime, (ener(ivec)+Esh, ivec=1,jvec)
+          if (present(deltaE)) then
+             write(file,9005) (deltaE(ivec), ivec=1,jvec)
+          endif
+       else
+          !first row has timings and iter number
+          write(file,9003) iter, time, walltime, (ener(ivec)+Esh, ivec=1,nbre_col)
+          if (present(deltaE)) then
+             write(file,9005) (deltaE(ivec), ivec=1,nbre_col)
+          endif
+          do jcol = 2,icol
+             ish = (jcol-1)*nbre_col
+             write(file,9004) (ener(ivec)+Esh, ivec=1+ish,nbre_col+ish)
+             if (present(deltaE)) then
+                write(file,9005) (deltaE(ivec), ivec=1+ish,nbre_col+ish)
+             endif
+          end do
+          !Last line has less than 5 energies
+          if (jvec.ne.0) then
+             ish = icol*nbre_col
+             write(file,9004) (ener(ivec)+Esh, ivec=1+ish,jvec+ish)
+             if (present(deltaE)) then
+                write(file,9005) (deltaE(ivec), ivec=1+ish,jvec+ish)
+             endif
+          end if
+       end if
+    else
+       !For guess energies
+       if (icol.eq.0) then 
+          write(file,9002) iter, (ener(ivec)+Esh, ivec=1,jvec)
+       else
+          do jcol = 1,icol
+             ish = (jcol-1)*nbre_col
+             write(file,9002) iter, (ener(ivec)+Esh, ivec=1+ish,nbre_col+ish)
+          end do
+          if (jvec.ne.0) then
+             ish = icol*nbre_col
+             write(file,9002) iter, (ener(ivec)+Esh, ivec=1+ish,jvec+ish)
+          end if
+       end if
+    endif
+
+9002 format(1x,"#Iter:",i5,"   Energies : ", 5(f17.10,2x))
+    !9003 format(1x,"#Iter:",i5,"   tCPU:",f12.4, " second(s)","   Energies : ", 5(f17.10,2x))
+9003 format(1x,i6,X,f12.4,X,f12.4,X,5(f17.10,2x))
+9004 format(1x,6x,X,12X,X,12X,X,5(f17.10,2x))
+9005 format(30X,11X,5(ES10.3E2,9x))
+  end subroutine wrt_ener
+
+  !$======================================================================== 
+  !> @brief wrt_ener 
+  !> @author MBL
+  !> @date July 2018
+  !
+  !> @param[in] Ener(1:nvec) energies to be printed
+  !> @param[in] iter Davidson iteration
+  !> @param[in] File on which the energies will be printedDavidson iteration
+  !$======================================================================== 
+  subroutine wrt_ener_mpi(Ener, Esh, nvec, iter, file, time, timecpu0, walltime, deltaE)
+    Integer, intent(in) :: nvec,iter,file
+    real(kd_dble), dimension(nvec), intent(in) :: Ener
+    real(kd_dble), dimension(nvec), optional, intent(in) :: deltaE
+    real(kd_dble),  intent(in) :: Esh
+    real(kd_dble):: time, walltime, timecpu0
+    
+    Integer :: nbre_col, icol, jcol, ish, ivec, jvec 
+
+    nbre_col = 5
+    icol = nvec/ nbre_col
+    jvec = nvec -  icol*nbre_col
+    
+    if (icol.eq.0) then
+       !less than 5 energies, only one row
+       write(file,9011) iter, time, timecpu0, walltime, (ener(ivec)+Esh, ivec=1,jvec)
+       if (present(deltaE)) then
+          write(file,9005) (deltaE(ivec), ivec=1,jvec)
+       endif
+    else
+       !first row has timings and iter number
+       write(file,9011) iter, time, timecpu0, walltime, (ener(ivec)+Esh, ivec=1,nbre_col)
+       if (present(deltaE)) then
+          write(file,9005) (deltaE(ivec), ivec=1,jvec)
+       endif
+       do jcol = 2,icol
+          ish = (jcol-1)*nbre_col
+          write(file,9012) (ener(ivec)+Esh, ivec=1+ish,nbre_col+ish)
+          if (present(deltaE)) then
+             write(file,9005) (deltaE(ivec), ivec=1,jvec)
+          endif
+       end do
+       if (jvec.ne.0) then
+          ish = icol*nbre_col
+          write(file,9012) (ener(ivec)+Esh, ivec=1+ish,jvec+ish)
+          if (present(deltaE)) then
+             write(file,9005) (deltaE(ivec), ivec=1+ish,jvec+ish)
+          endif
+       end if
+
+       flush(file)
+       
+    end if
+   
+9011 format(1x,i6,3(X,f12.4),X,5(f17.10,2x))
+9012 format(7X,39X,X,5(f17.10,2x))
+9005 format(7X,46X,X,5(ES10.3E2,9x))
+
+  end subroutine wrt_ener_mpi
+
+  !$======================================================================== 
+  !> @brief Check hermiticity of the saved Hamiltonian matrix
+  !> @author ER
+  !> @date 2018
+  !$======================================================================== 
+   subroutine check_hermiticity(Hmat,ndet)
+
+    real(kd_dble), dimension(:,:) :: hmat
+    integer :: ndet
+
+    real(kd_dble) :: tol = 1.d-15
+    integer :: i,j
+    real(kd_dble) :: err, toterr
+    logical :: l_hermit
+
+    l_hermit = .true.
+    toterr = 0.d0
+    do i=1, ndet
+       do j=i,ndet
+          err = abs(Hmat(i,j) - Hmat(j,i))
+          if (err .ge. tol) then
+             write(6,*) i,j,Hmat(i,j), Hmat(j,i),err
+             flush(6)
+             l_hermit = .false.
+             
+          endif
+          toterr = toterr + err
+       end do
+    end do
+    
+    if (.not.(l_hermit)) then
+       write(f_output,*) 'Deviation from hermiticity', toterr, toterr/(ndet*ndet)
+       call SASS_quit('Heff Not symmetric',f_output)
+    endif
+    
+  end subroutine check_hermiticity
+
+  !$======================================================================== 
+  !> @brief Sort Mpi timings
+  !> @author ER
+  !> @date Dec. 2019
+  !$======================================================================== 
+  subroutine sort_mpi_timings(mpilist, det, prog_info, iter)
+
+    type(int_blockpair_list), intent(inout)    :: mpilist
+    type(deter_dblocklist), intent(in)         :: det
+    type(prog_infotype), intent(in)            :: prog_info
+    integer, intent(in)                        :: iter
+    
+    type(int_blockpair) :: mpiitem
+    integer :: i, nint_blockpair
+    integer, dimension(:), allocatable :: tmp
+    integer :: nb_cpu, id_cpu, nbig_cpu
+    
+    integer :: tmpbeg, tmpend, posindex
+    real(kd_dble),dimension(:),allocatable :: sum_wall
+
+    type(deter_dblock), pointer :: DblockI, DblockJ
+
+!    integer :: iunit, iunit_sort
+
+    nint_blockpair = mpilist%nint_blockpair
+    
+    allocate(tmp(nint_blockpair))
+    tmp(:) = 0
+
+
+    !Sort the wall timing in descending order, the array of permutation wrt the initial ordering
+    !is given in tmp
+    call hpsort_eps_epw(nint_blockpair, &
+         mpilist%wtime, tmp, 1.d-6)
+
+    tmpbeg = 1
+    tmpend = nint_blockpair
+    posindex = 1
+
+    nb_cpu = prog_info%nb_cpu
+    allocate(sum_wall(nb_cpu))
+
+    mpilist%indx(:) = 0
+    sum_wall(:) = 0.d0
+    
+
+    !Assign the first nb_cpu indices to the biggest calculations 
+    do id_cpu = 1, nb_cpu
+       mpilist%indx(posindex) = tmp(tmpbeg)
+       sum_wall(id_cpu) = mpilist%wtime(id_cpu)
+       posindex = posindex + 1
+       tmpbeg = tmpbeg + 1
+    enddo
+
+    !The biggest CPU is nb 1
+    nbig_cpu = 1
+    
+    do while (posindex .le. nint_blockpair )! (nint_blockpair - mod(nint_blockpair,nb_cpu)))
+              
+       if (nbig_cpu .lt. nb_cpu) then
+          if (maxval(sum_wall(1:nbig_cpu)) .gt. sum_wall(nbig_cpu+1)) then
+             !On ajoute des petits timings sur les premiers cpus 
+             do id_cpu = 1, nbig_cpu
+                if (posindex .gt. nint_blockpair) goto 1000
+                mpilist%indx(posindex) = tmp(tmpend)
+                sum_wall(id_cpu) = sum_wall(id_cpu) + mpilist%wtime(tmpend)
+                tmpend = tmpend - 1
+                posindex = posindex + 1
+             enddo
+             !et des gros sur les suivants
+             do id_cpu = nbig_cpu + 1, nb_cpu
+                if (posindex .gt. nint_blockpair) goto 1000
+                mpilist%indx(posindex) = tmp(tmpbeg)
+                sum_wall(id_cpu) = sum_wall(id_cpu) + mpilist%wtime(tmpbeg)
+                posindex = posindex + 1
+                tmpbeg = tmpbeg + 1
+             enddo
+          else
+             !le cpu suivant est devenu aussi gros
+          
+             nbig_cpu = nbig_cpu + 1
+             do id_cpu = 1, nbig_cpu
+                if (posindex .gt. nint_blockpair) goto 1000
+                mpilist%indx(posindex) = tmp(tmpend)
+                sum_wall(id_cpu) = sum_wall(id_cpu) + mpilist%wtime(tmpend)
+                tmpend = tmpend - 1
+                posindex = posindex + 1
+             enddo
+             do id_cpu = nbig_cpu + 1, nb_cpu
+                if (posindex .gt. nint_blockpair) goto 1000
+                mpilist%indx(posindex) = tmp(tmpbeg)
+                sum_wall(id_cpu) = sum_wall(id_cpu) + mpilist%wtime(tmpbeg)
+                posindex = posindex + 1
+                tmpbeg = tmpbeg + 1
+             enddo
+          endif
+       else
+          nbig_cpu = 1
+          do while ((maxval(sum_wall(1:nbig_cpu)) .lt. sum_wall(nbig_cpu+1)) .and. &
+               (posindex .lt. (nint_blockpair - mod(nint_blockpair,nb_cpu))))
+             do id_cpu = 1, nb_cpu
+                if (posindex .gt. nint_blockpair) goto 1000
+                mpilist%indx(posindex) = tmp(tmpbeg)
+                sum_wall(id_cpu) = sum_wall(id_cpu) + mpilist%wtime(tmpbeg)
+                posindex = posindex + 1
+                tmpbeg = tmpbeg + 1
+             enddo
+          enddo
+                    
+       endif      
+    enddo
+    
+1000 continue
+    
+    if ((prog_info%id_cpu .eq. 0).and. (prog_info%iprint .ge. 0))  then
+       write(*,*) 'Final Sum Wall time on the dfifferent CPUs'
+       write(*,*) sum_wall(:)
+    endif
+    
+!!$       call wrt_int_blockpair_list(mpilist, iunit_sort)
+!!$       
+!!$       write(iunit,*) '>>> Ordered CPU time iter', iter
+!!$       do i=1,mpilist%nint_blockpair
+!!$          mpiitem = mpilist%l(mpilist%indx(i))
+!!$          DblockI => det%detblock(mpiitem%indxI)%p
+!!$          DblockJ => det%detblock(mpiitem%indxJ)%p
+!!$          write(iunit,'(3A,I3,A,I3)') &
+!!$               'Integral ', mpiitem%intkind, ' on blocks D', &
+!!$               DblockI%name, ' and D', DblockJ%name
+!!$          
+!!$          write(iunit,'(3A,I3,A,I3,A,I0,2A,2(F12.4,A),F12.4)') &
+!!$               'Integral ', mpiitem%intkind, ' on blocks D', &
+!!$               DblockI%name, ' and D',&
+!!$               DblockJ%name, ' (spin ',&
+!!$               mpiitem%spincase,')', &
+!!$               ' added in tCPU:',mpilist%cputime(tmp(i)),' s, tWall:', &
+!!$               mpilist%wtime(i),' s, ratio:',mpilist%cputime(tmp(i))/mpilist%wtime(i)
+!!$          
+!!$       enddo
+!!$    endif
+    deallocate(tmp)
+    deallocate(sum_wall)
+!!$    close(iunit)
+!!$    close(iunit_sort)
+
+  end subroutine sort_mpi_timings
+
+  !> @brief Read Hmat from file and diagonalise
+  !> @author Elisa Rebolini
+  !> @date 03-2020
+  !
+  !> @param[inout] Hmat
+  !> @param[in]    ndet Nb of determinants
+  !> @param[in]    nvec Nb of requested eigenvalues/eigenvectors
+  !> @param[in]    prog_info
+  subroutine read_hmat_from_file(Hmat, ndet, nvec, prog_info)
+
+    integer, intent(in)                                       :: ndet, nvec  
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: Hmat
+    type(prog_infotype), intent(in)                           :: prog_info
+    
+    real(kd_dble), dimension(:,:), allocatable :: Vmat
+    real(kd_dble), dimension(:), allocatable   :: Emat
+    integer :: ntmp, info, i
+
+    if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) 'Read Hmat from file'          
+       endif
+
+       if (.not.(allocated(Hmat))) allocate(Hmat(ndet,ndet))
+
+       Hmat(:,:) = 0.d0
+       rewind(f_mat)
+       read(f_mat,*) ntmp
+       do i = 1, ndet
+          read(f_mat,*) Hmat(i,:)
+       end do
+
+  end subroutine read_hmat_from_file
+  
+end module SASS_diag
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/all_case.F90 b/src/all_case.F90
new file mode 100644
index 0000000000000000000000000000000000000000..71fde7760196e2726ff7e4f2bacb73494ed324fb
--- /dev/null
+++ b/src/all_case.F90
@@ -0,0 +1,14012 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module utils_intcase
+
+  use info
+  use files
+   
+  implicit none
+
+  !$============================================================
+  !> @brief type for a 2-el integral case for H V_m
+  !!
+  !! elm = sign * sum_Nsumact d12 d34 (x1 x2 | x3 x4)
+  !!                             - d14 d23 (x1 x4 | x2 x3)
+  !$============================================================
+  type, public :: intcase
+     !> @brief character string for the integral kind and the
+     !! exchange integral case when necessaey
+     character(4)                  :: intkind, intkindx
+     !> @brief Id number for the determinant blocks I and J
+     integer                       :: id_blockI, id_blockJ
+     !> @brief Id number for the hole, particle and active cases
+     integer                       :: hcase, pcase, actcase
+     !> @brief Logical for the exchange integral block
+     logical                       :: lintx
+     !> @brief Range of the summation over the active orbitals
+     !! 0 when no summation
+     integer                       :: nsumact
+     !> @brief Global sign of the term
+     integer                       :: sign
+     !> @brief Presence of the delta functions
+     logical                       :: d12, d34, d14, d23
+     !> @brief character strings for the spatial orbitals
+     character(8)                  :: x1, x2, x3, x4
+     !> @brief order of the exchanged orbitals
+     integer                       :: OrderExc
+  end type intcase
+
+  type, public :: intcasep
+     type(intcase), pointer :: p
+  end type intcasep
+  
+  type, public :: intcase_list
+     integer :: ncases = 686! 70
+     type(intcasep), dimension(:), allocatable :: cases
+  end type intcase_list
+
+contains
+
+
+  !!============================================================ 
+  !> @brief Write an intcase object to f_output
+  !! parameters
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!
+  !> @param case Integral case
+  !> @param id ID number of the integral case
+  !!============================================================ 
+  subroutine wrt_intcase_id(case,id)
+
+    type(intcase), intent(in) :: case
+    integer, intent(in)       :: id
+
+    integer :: fid
+
+    fid = f_output
+
+    write(fid,'(X,A,X,I0)') 'Intcase',id
+    write(fid,'(3X,A,X,A)') 'intkind',case%intkind
+  end subroutine wrt_intcase_id
+
+  !!============================================================ 
+  !> @brief Initialise an intcase object from a given list of
+  !! parameters
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!
+  !> @param a intcase object to be initialised
+  !> @param intkind character string for the integral kind
+  !> @param intkind character string for the exchange integral kind
+  !> @param id_blockI Id number for the determinant block I
+  !> @param id_blockJ Id number for the determinant block J
+  !> @param hcase Id number for the hole case
+  !> @param pcase Id number for the particule case
+  !> @param actcase Id number for the active case
+  !> @param lintx
+  !> @param nsumact
+  !> @param sign
+  !> @param d12
+  !> @param d34
+  !> @param d14
+  !> @param d23
+  !> @param x1
+  !> @param x2
+  !> @param x3
+  !> @param x4
+  !> @param orderexc
+  !!============================================================
+  subroutine intcase_init(a, intkind, intkindx, id_blockI, id_blockJ, &
+       hcase, pcase, actcase, lintx, nsumact, sign, d12, d34, d14, d23, &
+       x1, x2, x3, x4, orderexc)
+
+    type(intcase), intent(inout)  :: a
+    character(4), intent(in)      :: intkind, intkindx
+    integer, intent(in)           :: id_blockI, id_blockJ
+    integer, intent(in)           :: hcase, pcase, actcase
+    logical, intent(in)           :: lintx
+    integer, intent(in)           :: nsumact
+    integer, intent(in)           :: sign
+    logical, intent(in)           :: d12, d34, d14, d23
+    character(8), intent(in)      :: x1, x2, x3, x4
+    integer, intent(in)           :: orderexc
+
+    a%intkind = intkind
+    a%intkindx = intkindx
+    a%id_blockI = id_blockI
+    a%id_blockJ = id_blockJ
+    a%hcase = hcase
+    a%pcase = pcase
+    a%actcase = actcase
+    a%lintx = lintx
+    a%nsumact = nsumact
+    a%sign = sign
+    a%d12 = d12
+    a%d34 = d34
+    a%d14 = d14
+    a%d23 = d23
+    a%x1 = x1
+    a%x2 = x2
+    a%x3 = x3
+    a%x4 = x4
+    a%orderexc = orderexc
+    
+  end subroutine intcase_init
+
+  !!============================================================ 
+  !> @brief Initialise and fill the list of all intcases
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!
+  !> @param intcases Array of all intcases
+  !> @param nelact Nb of active electrons
+  !!============================================================
+  subroutine intcaselist_init(intcases, nelact)
+
+    integer, intent(in)             :: nelact
+    type(intcase_list), intent(out) :: intcases
+
+    integer                         :: intcase_id
+    type(intcase), pointer          :: a
+
+    character(4)                    :: intkind, intkindx
+    integer                         :: id_blockI, id_blockJ
+    integer                         :: hcase, pcase, actcase
+    logical                         :: lintx
+    integer                         :: nsumact
+    integer                         :: sign
+    logical                         :: d12, d34, d14, d23
+    character(8)                    :: x1, x2, x3, x4
+    integer                         :: orderexc
+
+    allocate(intcases%cases(intcases%ncases))
+
+    do intcase_id = 1, intcases%ncases
+       nullify(intcases%cases(intcase_id)%p)
+       allocate(intcases%cases(intcase_id)%p)
+       a => intcases%cases(intcase_id)%p
+       select case (intcase_id)
+  case (1)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 9 
+     pcase = 1 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (2)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 5 
+     pcase = 1 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .true.
+     d14 = .true.
+     d23 = .true.
+     orderexc = 1423
+  case (3)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 11 
+     pcase = 1 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .true.
+     d14 = .true.
+     d23 = .true.
+     orderexc = 1423
+  case (4)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 5 
+     pcase = 1 
+     actcase = 0 
+     lintx = .true.
+     nsumact = nelact+1
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .true.
+     orderexc = 1423
+  case (5)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 11 
+     pcase = 1 
+     actcase = 0 
+     lintx = .true.
+     nsumact = nelact+1
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .true.
+     orderexc = 1423
+  case (6)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 9
+     pcase = 9 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (7)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 5
+     pcase = 9 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (8)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 11
+     pcase = 9 
+     actcase = 1 
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (9)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 5
+     pcase = 9 
+     actcase = 0 
+     lintx = .true.
+     nsumact = nelact
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (10)
+     intkind = 'aaoo'
+     intkindx = 'aoao'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 11
+     pcase = 9 
+     actcase = 0 
+     lintx = .true.
+     nsumact = nelact
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+
+     ! 'aaao'
+  case (11)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 00
+     id_blockJ = 11
+     hcase = 2
+     pcase = 1
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffJ(2)'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .true.
+     d14 = .false.
+     d23 = .true.
+     orderexc = 1324
+  case (12)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 00
+     id_blockJ = 11
+     hcase = 2
+     pcase = 1
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .false.
+     d14 = .false.
+     d23 = .true.
+     orderexc = 1324 
+  case (13)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 11
+     id_blockJ = 00
+     hcase = 4
+     pcase = 1
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = -1
+     x1 = 'diffJ(1)'
+     x2 = 'diffI(2)'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .false.
+     d23 = .true.
+     orderexc = 1324
+  case (14)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 11
+     id_blockJ = 00
+     hcase = 4
+     pcase = 1
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .false.
+     d23 = .true.
+     orderexc = 1324
+  case (15)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 01
+     id_blockJ = -11
+     hcase = 4
+     pcase = 9
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = -1
+     x1 = 'diffJ(1)'
+     x2 = 'diffI(2)'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (16)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = 01
+     id_blockJ = -11
+     hcase = 4
+     pcase = 9
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (17)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = -11
+     id_blockJ = 01
+     hcase = 2
+     pcase = 9
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffJ(2)'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .true.
+     d14 = .false.
+     d23 = .true.
+     orderexc = 1324
+  case (18)
+     intkind = 'aaao'
+     intkindx = 'aaao'
+     id_blockI = -11
+     id_blockJ = 01
+     hcase = 2
+     pcase = 9
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+
+     ! 'AAAA'
+  case (19)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 00
+     id_blockJ = 00
+     hcase = 1
+     pcase = 1
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(2)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (20)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 00
+     id_blockJ = 00
+     hcase = 1
+     pcase = 1
+     actcase = 1
+     lintx = .false.
+     nsumact = Nelact-1
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423 
+  case (21)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 9
+     pcase = 1
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(2)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423 
+  case (22)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 11
+     id_blockJ = 11
+     hcase = 9
+     pcase = 1
+     actcase = 1
+     lintx = .false.
+     nsumact = Nelact
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (23)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 9
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(2)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423 
+  case (24)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 9
+     actcase = 1
+     lintx = .false.
+     nsumact = Nelact-2
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (25)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 9
+     pcase = 9
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'diffI(1)'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(2)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423 
+  case (26)
+     intkind = 'aaaa'
+     intkindx = 'aaaa'
+     id_blockI = 01
+     id_blockJ = 01
+     hcase = 9
+     pcase = 9
+     actcase = 1
+     lintx = .false.
+     nsumact = Nelact-1
+     sign = +1
+     x1 = 'andIJ(k)'
+     x2 = 'andIJ(k)'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+
+     !'VAOO
+  case (27)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 01
+     id_blockJ = 11
+     hcase = 9
+     pcase = 4
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (28)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 01
+     id_blockJ = 11
+     hcase = 5
+     pcase = 4
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (29)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 01
+     id_blockJ = 11
+     hcase = 11
+     pcase = 4
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (30)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 11
+     id_blockJ = 01
+     hcase = 9
+     pcase = 2
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (31)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 11
+     id_blockJ = 01
+     hcase = 5
+     pcase = 2
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 't1'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (32)
+     intkind = 'vaoo'
+     intkindx = 'voao'
+     id_blockI = 11
+     id_blockJ = 01
+     hcase = 11
+     pcase = 2
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 't1'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .true.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+
+
+     !'VAAO'
+  case (33)
+     intkind = 'vaao'
+     intkindx = 'voaa'
+     id_blockI = 00
+     id_blockJ = 01
+     hcase = 2
+     pcase = 2
+     actcase = 0
+     lintx = .true.
+     nsumact = Nelact
+     sign = -1
+     x1 = 'p3'
+     x2 = 'andIJ(k)'
+     x3 = 'andIJ(k)'
+     x4 = 't3'
+     d12 = .true.
+     d34 = .false.
+     d14 = .false.
+     d23 = .false.
+     orderexc = 1423 
+  case (34)
+     intkind = 'vaao'
+     intkindx = 'voaa'
+     id_blockI = 00
+     id_blockJ = 01
+     hcase = 2
+     pcase = 2
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (35)
+     intkind = 'vaao'
+     intkindx = 'voaa'
+     id_blockI = 01
+     id_blockJ = 00
+     hcase = 4
+     pcase = 4
+     actcase = 0
+     lintx = .true.
+     nsumact = Nelact
+     sign = -1 
+     x1 = 'p1'
+     x2 = 'andIJ(k)'
+     x3 = 'andIJ(k)'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .false.
+     d23 = .false.
+     orderexc = 1423
+  case (36)
+     intkind = 'vaao'
+     intkindx = 'voaa'
+     id_blockI = 01
+     id_blockJ = 00
+     hcase = 4
+     pcase = 4
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (37)
+     intkind = 'vaao'
+     intkindx = 'vaao'
+     id_blockI = 11
+     id_blockJ = -11
+     hcase = 4
+     pcase = 2
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'diffI(2)'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (38)
+     intkind = 'vaao'
+     intkindx = 'vaao'
+     id_blockI = -11
+     id_blockJ = 11
+     hcase = 2
+     pcase = 4
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'diffJ(2)'
+     x4 = 't3'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+
+     ! 'VAAA'
+  case (39)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 00
+     id_blockJ = -11
+     hcase = 1
+     pcase = 2
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'diffI(2)'
+     x4 = 'diffJ(1)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (40)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 00
+     id_blockJ = -11
+     hcase = 1
+     pcase = 2
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (41)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = -11
+     id_blockJ = 00
+     hcase = 1
+     pcase = 4
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (42)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = -11
+     id_blockJ = 00
+     hcase = 1
+     pcase = 4
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (43)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 01
+     id_blockJ = 11
+     hcase = 9
+     pcase = 4
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (44)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 01
+     id_blockJ = 11
+     hcase = 9
+     pcase = 4
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'diffJ(1)'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (45)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 11
+     id_blockJ = 01
+     hcase = 9
+     pcase = 2
+     actcase = 1
+     lintx = .false.
+     nsumact = nelact
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (46)
+     intkind = 'vaaa'
+     intkindx = 'vaaa'
+     id_blockI = 11
+     id_blockJ = 01
+     hcase = 9
+     pcase = 2
+     actcase = 2
+     lintx = .false.
+     nsumact = 0
+     sign = +1
+     x1 = 'p3'
+     x2 = 'diffI(1)'
+     x3 = 'diffJ(1)'
+     x4 = 'diffI(2)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+
+     ! 'VVAA'
+  case (47)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 9
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p1'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (48)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 5
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (49)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 11
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (50)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 5
+     actcase = 0
+     lintx = .true.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (51)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI = -11
+     id_blockJ = -11
+     hcase = 1
+     pcase = 11
+     actcase = 0
+     lintx = .true.
+     nsumact = nelact-1
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (52)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 9 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p1'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (53)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 5 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (54)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 11
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 'diffJ(1)'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (55)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 5 
+     actcase = 0
+     lintx = .true.
+     nsumact = nelact
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (56)
+     intkind = 'vvaa'
+     intkindx = 'vava'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 11
+     actcase = 0
+     lintx = .true.
+     nsumact = nelact
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'andIJ(k)'
+     x4 = 'andIJ(k)'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (57)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 5
+     pcase = 9 
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p1'
+     x3 = 't1'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (58)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 11
+     pcase = 9 
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p1'
+     x3 = 't1'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (59)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 5 
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (60)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 9
+     pcase = 11
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = -1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't1'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (61)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 5
+     pcase = 5 
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (62)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 11
+     pcase = 5 
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (63)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 5
+     pcase = 11
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (64)
+     intkind = 'vvoo'
+     intkindx = 'vovo'
+     id_blockI =  01
+     id_blockJ =  01
+     hcase = 11
+     pcase = 11
+     actcase = 0
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 't3'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1423
+  case (65)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI =  01
+     id_blockJ = -11
+     hcase = 4
+     pcase = 9 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x2 = 'p1'
+     x1 = 'p1'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (66)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI =  01
+     id_blockJ = -11
+     hcase = 4
+     pcase = 5 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x2 = 'p1'
+     x1 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (67)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI =  01
+     id_blockJ = -11
+     hcase = 4
+     pcase = 11
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x2 = 'p1'
+     x1 = 'p3'
+     x3 = 'diffI(1)'
+     x4 = 't1'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (68)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI = -11
+     id_blockJ = 01
+     hcase = 2
+     pcase = 9 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x2 = 'p1'
+     x1 = 'p1'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .false.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (69)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI = -11
+     id_blockJ = 01
+     hcase = 2
+     pcase = 5 
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (70)
+     intkind = 'vvao'
+     intkindx = 'vavo'
+     id_blockI = -11
+     id_blockJ = 01
+     hcase = 2
+     pcase = 11
+     actcase = 1
+     lintx = .true.
+     nsumact = 0
+     sign = +1
+     x1 = 'p1'
+     x2 = 'p3'
+     x3 = 'diffJ(1)'
+     x4 = 't3'
+     d12 = .true.
+     d34 = .false.
+     d14 = .true.
+     d23 = .false.
+     orderexc = 1324
+  case (71) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (72) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (73) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (74) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (75) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (76) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (77) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (78) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (79) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (80) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (81) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (82) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (83) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (84) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (85) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (86) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (87) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (88) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (89) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (90) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (91) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (92) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (93) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (94) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (95) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (96) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (97) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (98) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (99) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (100) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (101) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (102) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 22
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (103) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 16
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (104) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 18
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (105) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 21
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (106) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 23
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (107) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 26
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (108) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 29
+    pcase = 1
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (109) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 16
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (110) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 18
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (111) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 21
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (112) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 23
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (113) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 26
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (114) 
+    intkind = 'aaoo'
+    intkindx = 'aoao' 
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 29
+    pcase = 1
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (115) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = 00
+    id_blockJ = 20
+    hcase = 3
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (116) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = 20
+    id_blockJ = 00
+    hcase = 13
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (117) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = 02
+    id_blockJ = -20
+    hcase = 13
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (118) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = -20
+    id_blockJ = 02
+    hcase = 3
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (119) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = 12
+    id_blockJ = -11
+    hcase = 13
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (120) 
+    intkind = 'aoao'
+    intkindx = 'aoao'
+    id_blockI = -11
+    id_blockJ = 12
+    hcase = 3
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (121) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (122) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (123) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (124) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (125) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (126) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (127) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 2314
+  case (128) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 2314
+  case (129) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (130) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (131) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 3214
+  case (132) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 3214
+  case (133) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (134) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (135) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (136) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (137) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 7
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (138) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 10
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (139) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 7
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (140) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 10
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (141) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 20
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (142) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 28
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (143) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 20
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 3214
+  case (144) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 28
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 3214
+  case (145) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (146) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 3214
+  case (147) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (148) 
+    intkind = 'aaao'
+    intkindx = 'aaao'
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (149) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(2)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (150) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (151) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 9
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(2)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (152) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (153) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(2)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (154) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (155) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 22
+    pcase = 1
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(2)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (156) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 22
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (157) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 22
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(2)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (158) 
+    intkind = 'aaaa'
+    intkindx = 'aaaa'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-3
+    sign = 1
+    x1 = 'andIJ(k)'
+    x2 = 'andIJ(k)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (159) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (160) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (161) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (162) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (163) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (164) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (165) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 15
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (166) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 17
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (167) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 19
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (168) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 25
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (169) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 27
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (170) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 31
+    pcase = 22
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (171) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (172) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (173) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (174) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (175) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (176) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (177) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 15
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (178) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 17
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (179) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 19
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (180) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 25
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (181) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 27
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (182) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 31
+    pcase = 9
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (183) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 16
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (184) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 18
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (185) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 21
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (186) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 23
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (187) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 26
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (188) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 29
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 't1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (189) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 15
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (190) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 17
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (191) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 19
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (192) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 25
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (193) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 27
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (194) 
+    intkind = 'oooo'
+    intkindx = 'oooo'
+    id_blockI = 20
+    id_blockJ = 20
+    hcase = 31
+    pcase = 1
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 't1'
+    x2 = 't3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (195) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 16
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (196) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 18
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (197) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 21
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (198) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 23
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (199) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 26
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (200) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 29
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (201) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 15
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (202) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 17
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (203) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 19
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (204) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 25
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (205) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 27
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (206) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 31
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (207) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 16
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (208) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 18
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (209) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 21
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (210) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 23
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (211) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 26
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (212) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 29
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (213) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 15
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (214) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 17
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (215) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 19
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (216) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 25
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (217) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 27
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (218) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 31
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (219) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 16
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (220) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 18
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (221) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 21
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (222) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 23
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (223) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 26
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (224) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 29
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'p4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (225) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 15
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (226) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 17
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (227) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 19
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (228) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 25
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (229) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 27
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (230) 
+    intkind = 'vvvv'
+    intkindx = 'vvvv'
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 31
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'p4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (231) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (232) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (233) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 6
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (234) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 8
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (235) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 12
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (236) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (237) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (238) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 14
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (239) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 24
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (240) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 30
+    pcase = 9
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (241) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (242) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (243) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 14
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (244) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 24
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (245) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 30
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (246) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (247) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (248) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 6
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (249) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 8
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (250) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 12
+    pcase = 22
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (251) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 7
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (252) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 10
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (253) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 6
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (254) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 8
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (255) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 11
+    id_blockJ = 20
+    hcase = 12
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffJ(1)'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1432
+  case (256) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 20
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (257) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 28
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'diffI(1)'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (258) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 14
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (259) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 24
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (260) 
+    intkind = 'aooo'
+    intkindx = 'aooo'
+    id_blockI = 20
+    id_blockJ = 11
+    hcase = 30
+    pcase = 1
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'diffI(1)'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .true.
+    d14 = .false.
+    d23 = .true.
+    orderexc = 1324
+  case (261) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (262) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (263) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (264) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (265) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (266) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (267) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (268) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (269) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (270) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (271) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (272) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (273) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (274) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (275) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (276) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (277) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 22
+    pcase = 4
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (278) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 22
+    pcase = 4
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (279) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 22
+    pcase = 2
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (280) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 22
+    pcase = 2
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (281) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (282) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (283) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (284) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (285) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (286) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (287) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (288) 
+    intkind = 'vaaa'
+    intkindx = 'vaaa'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (289) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (290) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (291) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (292) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (293) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (294) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (295) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (296) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (297) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (298) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (299) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (300) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (301) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (302) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (303) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 5
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (304) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 11
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (305) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (306) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (307) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (308) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (309) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (310) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (311) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (312) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (313) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (314) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (315) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (316) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (317) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (318) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (319) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (320) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (321) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (322) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (323) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (324) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (325) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (326) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (327) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (328) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (329) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (330) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (331) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (332) 
+    intkind = 'vvaa'
+    intkindx = 'vava' 
+    id_blockI = -20
+    id_blockJ = -20
+    hcase = 1
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-2
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'andIJ(k)'
+    x4 = 'andIJ(k)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (333) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = 00
+    id_blockJ = -20
+    hcase = 1
+    pcase = 3
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 'diffI(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (334) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = -20
+    id_blockJ = 00
+    hcase = 1
+    pcase = 13
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (335) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = 02
+    id_blockJ = 20
+    hcase = 22
+    pcase = 13
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (336) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = 20
+    id_blockJ = 02
+    hcase = 22
+    pcase = 3
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 'diffI(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (337) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = 11
+    id_blockJ = -12
+    hcase = 9
+    pcase = 3
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 'diffI(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (338) 
+    intkind = 'vava'
+    intkindx = 'vava'
+    id_blockI = -12
+    id_blockJ = 11
+    hcase = 9
+    pcase = 13
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 'diffJ(2)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (339) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (340) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (341) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (342) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (343) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (344) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 22
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (345) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (346) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (347) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (348) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (349) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (350) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (351) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (352) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (353) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (354) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (355) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (356) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (357) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (358) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (359) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (360) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (361) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (362) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (363) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (364) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (365) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (366) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (367) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (368) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (369) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (370) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (371) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (372) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (373) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (374) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (375) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (376) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (377) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (378) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (379) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (380) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (381) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 16
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (382) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 18
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (383) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 21
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (384) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 23
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (385) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 26
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't4'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (386) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 02
+    id_blockJ = 02
+    hcase = 29
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (387) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (388) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 22
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (389) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (390) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (391) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (392) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (393) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (394) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 9
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (395) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (396) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (397) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (398) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (399) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (400) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 5
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (401) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 16
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (402) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 18
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (403) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 21
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (404) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 23
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (405) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 26
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (406) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = 12
+    id_blockJ = 12
+    hcase = 29
+    pcase = 11
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (407) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (408) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (409) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (410) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (411) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (412) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 9
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (413) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (414) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 22
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (415) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (416) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (417) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (418) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (419) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (420) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 5
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (421) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 16
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (422) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 18
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (423) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 21
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (424) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 23
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (425) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 26
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (426) 
+    intkind = 'vvoo'
+    intkindx = 'vovo' 
+    id_blockI = -12
+    id_blockJ = -12
+    hcase = 11
+    pcase = 29
+    actcase = 0
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (427) 
+    intkind = 'vovo'
+    intkindx = 'vovo'
+    id_blockI = 00
+    id_blockJ = 02
+    hcase = 3
+    pcase = 3
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (428) 
+    intkind = 'vovo'
+    intkindx = 'vovo'
+    id_blockI = 02
+    id_blockJ = 00
+    hcase = 13
+    pcase = 13
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (429) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (430) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (431) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (432) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (433) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 6
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (434) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 8
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (435) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 12
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (436) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 6
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (437) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 8
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (438) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 12
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (439) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (440) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (441) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (442) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (443) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 14
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (444) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 24
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (445) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 30
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (446) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 14
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (447) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 24
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (448) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 30
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (449) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (450) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (451) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 6
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (452) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 8
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (453) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 12
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (454) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (455) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (456) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 14
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (457) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 24
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (458) 
+    intkind = 'vvvo'
+    intkindx = 'vvvo'
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 30
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (459) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (460) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (461) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 6
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (462) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 8
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (463) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 12
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (464) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (465) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (466) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 14
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (467) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 24
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (468) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 30
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (469) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (470) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (471) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 14
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (472) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 24
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (473) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 30
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (474) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (475) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (476) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 6
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (477) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 8
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (478) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 12
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (479) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p3'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (480) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (481) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 6
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (482) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 8
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (483) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -11
+    id_blockJ = -20
+    hcase = 1
+    pcase = 12
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p4'
+    x4 = 'diffI(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (484) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (485) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p2'
+    x3 = 'p1'
+    x4 = 'diffJ(1)'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (486) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 14
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (487) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 24
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (488) 
+    intkind = 'vvva'
+    intkindx = 'vvva'
+    id_blockI = -20
+    id_blockJ = -11
+    hcase = 1
+    pcase = 30
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'p2'
+    x4 = 'diffJ(1)'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (489) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (490) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p4'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (491) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (492) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p4'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (493) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 6
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (494) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 8
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (495) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 12
+    pcase = 7
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (496) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 6
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (497) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 8
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (498) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 12
+    pcase = 10
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (499) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (500) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (501) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (502) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (503) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 14
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (504) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 24
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (505) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 30
+    pcase = 20
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (506) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 14
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (507) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 24
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (508) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 30
+    pcase = 28
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1342
+  case (509) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 7
+    pcase = 2
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 't4'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (510) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 10
+    pcase = 2
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (511) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 6
+    pcase = 2
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (512) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 8
+    pcase = 2
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (513) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 12
+    pcase = 2
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 't4'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (514) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 20
+    pcase = 4
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't2'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (515) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 28
+    pcase = 4
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 't2'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (516) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 14
+    pcase = 4
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (517) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 24
+    pcase = 4
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (518) 
+    intkind = 'vooo'
+    intkindx = 'vooo'
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 30
+    pcase = 4
+    actcase = 0
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 't3'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (519) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (520) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 9
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (521) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 5
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (522) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 11
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (523) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 5
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (524) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 01
+    id_blockJ = -12
+    hcase = 11
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (525) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (526) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 9
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (527) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 5
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (528) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 11
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (529) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 5
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (530) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = -12
+    id_blockJ = 01
+    hcase = 11
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (531) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (532) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 22
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (533) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 16
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (534) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 18
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (535) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 21
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (536) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 23
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (537) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 26
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (538) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 29
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (539) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 16
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (540) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 18
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (541) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 21
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (542) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 23
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (543) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 26
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (544) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 02
+    id_blockJ = 12
+    hcase = 29
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (545) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (546) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 22
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (547) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 16
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (548) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 18
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (549) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 21
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (550) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 23
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (551) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 26
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (552) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 29
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (553) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 16
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (554) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 18
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (555) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 21
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (556) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 23
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (557) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 26
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (558) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 02
+    hcase = 29
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (559) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 22
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (560) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 16
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (561) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 18
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (562) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 21
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (563) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 23
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (564) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 26
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (565) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 12
+    id_blockJ = 20
+    hcase = 29
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (566) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 22
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = -1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'ti'
+    x4 = 'ti'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (567) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 16
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (568) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 18
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (569) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 21
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (570) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 23
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't1'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (571) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 26
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (572) 
+    intkind = 'vaoo'
+    intkindx = 'voao' 
+    id_blockI = 20
+    id_blockJ = 12
+    hcase = 29
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 't2'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (573) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = 02
+    id_blockJ = -11
+    hcase = 13
+    pcase = 20
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 't1'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (574) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = 02
+    id_blockJ = -11
+    hcase = 13
+    pcase = 28
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (575) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = -11
+    id_blockJ = 02
+    hcase = 3
+    pcase = 7
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (576) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = -11
+    id_blockJ = 02
+    hcase = 3
+    pcase = 10
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 't3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (577) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = 00
+    id_blockJ = 12
+    hcase = 3
+    pcase = 2
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 't3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (578) 
+    intkind = 'voao'
+    intkindx = 'voao'
+    id_blockI = 12
+    id_blockJ = 00
+    hcase = 13
+    pcase = 4
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 't1'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1432
+  case (579) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 7
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p3'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (580) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 10
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p4'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (581) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 7
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p3'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (582) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 10
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p4'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (583) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (584) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 7
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (585) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (586) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 01
+    id_blockJ = 02
+    hcase = 10
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (587) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 20
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p2'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (588) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 28
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p1'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (589) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 20
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p2'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (590) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 28
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact
+    sign = -1
+    x1 = 'p1'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (591) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (592) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 20
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (593) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (594) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 02
+    id_blockJ = 01
+    hcase = 28
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (595) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 01
+    id_blockJ = 20
+    hcase = 7
+    pcase = 4
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (596) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 01
+    id_blockJ = 20
+    hcase = 10
+    pcase = 4
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (597) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 20
+    id_blockJ = 01
+    hcase = 20
+    pcase = 2
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (598) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 20
+    id_blockJ = 01
+    hcase = 28
+    pcase = 2
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (599) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 01
+    id_blockJ = -20
+    hcase = 4
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (600) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 01
+    id_blockJ = -20
+    hcase = 4
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (601) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -20
+    id_blockJ = 01
+    hcase = 2
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (602) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -20
+    id_blockJ = 01
+    hcase = 2
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (603) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 7
+    pcase = 2
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = -1
+    x1 = 'p3'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (604) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 10
+    pcase = 2
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = -1
+    x1 = 'p3'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (605) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 7
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (606) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 11
+    id_blockJ = 12
+    hcase = 10
+    pcase = 2
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (607) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 20
+    pcase = 4
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = -1
+    x1 = 'p1'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (608) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 28
+    pcase = 4
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact+1
+    sign = -1
+    x1 = 'p1'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (609) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 20
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (610) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = 12
+    id_blockJ = 11
+    hcase = 28
+    pcase = 4
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (611) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 12
+    id_blockJ = -12
+    hcase = 20
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (612) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 12
+    id_blockJ = -12
+    hcase = 28
+    pcase = 7
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (613) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 12
+    id_blockJ = -12
+    hcase = 20
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (614) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = 12
+    id_blockJ = -12
+    hcase = 28
+    pcase = 10
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffI(2)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (615) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -12
+    id_blockJ = 12
+    hcase = 7
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (616) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -12
+    id_blockJ = 12
+    hcase = 10
+    pcase = 20
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (617) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -12
+    id_blockJ = 12
+    hcase = 7
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (618) 
+    intkind = 'vaao'
+    intkindx = 'vaao'
+    id_blockI = -12
+    id_blockJ = 12
+    hcase = 10
+    pcase = 28
+    actcase = 2
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffJ(2)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (619) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 7
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = -1
+    x1 = 'p3'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (620) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 10
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = -1
+    x1 = 'p4'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (621) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 7
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (622) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -11
+    id_blockJ = -12
+    hcase = 2
+    pcase = 10
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p4'
+    x2 = 'diffI(1)'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (623) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 20
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = -1
+    x1 = 'p2'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (624) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 28
+    actcase = 0
+    lintx = .true.
+    nsumact = Nelact-1
+    sign = -1
+    x1 = 'p1'
+    x2 = 'andIJ(k)'
+    x3 = 'andIJ(k)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .false.
+    d23 = .false.
+    orderexc = 1423
+  case (625) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 20
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (626) 
+    intkind = 'vaao'
+    intkindx = 'voaa' 
+    id_blockI = -12
+    id_blockJ = -11
+    hcase = 4
+    pcase = 28
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1423
+  case (627) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (628) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (629) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 5
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (630) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 7
+    pcase = 11
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (631) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 5
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (632) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 01
+    id_blockJ = 12
+    hcase = 10
+    pcase = 11
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (633) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (634) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 9
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p1'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (635) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 5
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (636) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 20
+    pcase = 11
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (637) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 5
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (638) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 12
+    id_blockJ = 01
+    hcase = 28
+    pcase = 11
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (639) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (640) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (641) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (642) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (643) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (644) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (645) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (646) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 20
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (647) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (648) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (649) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (650) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (651) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (652) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = 02
+    id_blockJ = -12
+    hcase = 28
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (653) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (654) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (655) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (656) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (657) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (658) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (659) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (660) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 7
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (661) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (662) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (663) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (664) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (665) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (666) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = 02
+    hcase = 10
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (667) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (668) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (669) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (670) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (671) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (672) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (673) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -12
+    id_blockJ = -20
+    hcase = 4
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffI(1)'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 2314
+  case (674) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 22
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'pi'
+    x2 = 'pi'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .false.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (675) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 16
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (676) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 18
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (677) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 21
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (678) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 23
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p2'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (679) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 26
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p3'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (680) 
+    intkind = 'vvao'
+    intkindx = 'vavo' 
+    id_blockI = -20
+    id_blockJ = -12
+    hcase = 2
+    pcase = 29
+    actcase = 1
+    lintx = .true.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'p4'
+    x3 = 'diffJ(1)'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 1324
+  case (681) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = 00
+    id_blockJ = -12
+    hcase = 2
+    pcase = 3
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (682) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = -12
+    id_blockJ = 00
+    hcase = 4
+    pcase = 13
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (683) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = 02
+    id_blockJ = 11
+    hcase = 20
+    pcase = 13
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 't1'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (684) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = 02
+    id_blockJ = 11
+    hcase = 28
+    pcase = 13
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p1'
+    x2 = 'diffJ(1)'
+    x3 = 'p2'
+    x4 = 't2'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (685) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = 11
+    id_blockJ = 02
+    hcase = 7
+    pcase = 3
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 't4'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+  case (686) 
+    intkind = 'vavo'
+    intkindx = 'vavo'
+    id_blockI = 11
+    id_blockJ = 02
+    hcase = 10
+    pcase = 3
+    actcase = 1
+    lintx = .false.
+    nsumact = 0
+    sign = 1
+    x1 = 'p3'
+    x2 = 'diffI(1)'
+    x3 = 'p4'
+    x4 = 't3'
+    d12 = .true.
+    d34 = .false.
+    d14 = .true.
+    d23 = .false.
+    orderexc = 3214
+case default
+          call SASS_quit('wrong intcase_id in intcase.f90',6)
+       end select
+
+       call intcase_init(intcases%cases(intcase_id)%p, &
+            intkind, intkindx, id_blockI, id_blockJ, &
+            hcase, pcase, actcase, lintx, nsumact, sign, d12, d34, d14, d23, &
+            x1, x2, x3, x4, orderexc)
+
+       !call wrt_intcase_id(intcases%cases(intcase_id)%p, intcase_id)
+
+    end do
+       
+    
+  end subroutine intcaselist_init
+
+  !!============================================================ 
+  !> @brief Free intcase list
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!
+  !> @param intcase list to be freed
+  !!============================================================
+  subroutine intcaselist_free(intcases)
+
+    type(intcase_list), intent(inout) :: intcases
+
+    integer :: i
+
+    do i = 1, intcases%ncases
+       if (associated(intcases%cases(i)%p)) then
+          deallocate(intcases%cases(i)%p)
+       endif
+    enddo
+
+    deallocate(intcases%cases)
+    
+  end subroutine intcaselist_free
+
+  !!============================================================ 
+  !> @brief Get the id case number 
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!
+  !> @param intcases intcase list
+  !> @param intkind character string for the integral kind
+  !> @param id_blockI Id number for the determinant block I
+  !> @param id_blockJ Id number for the determinant block J
+  !> @param hcase Id number for the hole case
+  !> @param pcase Id number for the particule case
+  !> @param actcase Id number for the active case
+  !> @param[out] id_case Id of the int Case
+  !!============================================================  
+  subroutine get_intcase_id(intcases, intkind, id_blockI, id_blockJ, hcase, &
+       pcase, actcase, id_case)
+
+    type(intcase_list), intent(in) :: intcases    
+    character(4)                   :: intkind
+    integer                        :: id_blockI, id_blockJ
+    integer                        :: hcase, pcase, actcase
+    integer, intent(out)           :: id_case
+
+    logical :: found
+    integer :: i
+    type(intcase), pointer :: a
+    Integer, dimension(100) :: idcasetmp
+    
+    found = .false.
+
+    id_case = 0
+    
+    do i = 1, intcases%ncases
+       a => intcases%cases(i)%p
+       if ((a%intkind .eq. intkind) .and. (a%id_blockI .eq. id_blockI) .and. &
+            (a%id_blockJ .eq. id_blockJ) .and. (a%hcase .eq. hcase) .and. &
+            (a%pcase .eq. pcase) .and. (a%actcase .eq. actcase)) then
+          found = .true.
+          id_case = i
+       end if
+    enddo
+    
+  end subroutine get_intcase_id
+end module utils_intcase
diff --git a/src/cio.c b/src/cio.c
new file mode 100644
index 0000000000000000000000000000000000000000..2ccb85ba725fe996d846b8ffa5f8e83d44906cdd
--- /dev/null
+++ b/src/cio.c
@@ -0,0 +1,311 @@
+/***********************************************************************
+* This file is part of OpenMolcas.                                     *
+*                                                                      *
+* OpenMolcas is free software; you can redistribute it and/or modify   *
+* it under the terms of the GNU Lesser General Public License, v. 2.1. *
+* OpenMolcas is distributed in the hope that it will be useful, but it *
+* is provided "as is" and without any express or implied warranties.   *
+* For more details see the full text of the license in the file        *
+* LICENSE or in <http://www.gnu.org/licenses/>.                        *
+*                                                                      *
+* Copyright (C) 1992, Markus P. Fuelscher                              *
+*               2012,2013, Victor P. Vysotskiy                         *
+*               2020, Ignacio Fdez. Galvan                             *
+***********************************************************************/
+/******************************************************************************/
+/*                                                                            */
+/*                               A I X - I / O                                */
+/*                                                                            */
+/*  The fast I/O calls the following C-langue primitives:                     */
+/*  open, close, read, write, lseek, remove and fsync                         */
+/*  This file includes the FORTRAN to C-language interfaces.                  */
+/*                                                                            */
+/*----------------------------------------------------------------------------*/
+/*                                                                            */
+/*    written by:                                                             */
+/*    M.P. Fuelscher                                                          */
+/*    University of Lund, Sweden, 1992                                        */
+/*                                                                            */
+/*----------------------------------------------------------------------------*/
+/*                                                                            */
+/*    history: Victor P. Vysotskiy, University of Lund, Sweden, 2012-2013     */
+/*            - collect all declarations in the 'cio.h' header file           */
+/*            - thread-safe pwrite/pread IO                                   */
+/*            - filesize information via 'c_stat'                             */
+/*            Ignacio Fdez. Galvan, 2020                                      */
+/*            - add c_rename                                                  */
+/*                                                                            */
+/******************************************************************************/
+
+#include <fcntl.h>
+#ifndef _WIN32_
+#include <unistd.h>
+#else
+#include <windows.h>
+#define open  _lopen
+#define close _lclose
+#define read  _lread
+#define write _lwrite
+#define lseek _llseek
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <sys/uio.h>
+#include "molcastype.h"
+#include "cio.h"
+
+#define MIN(x,y) (x<y? x : y)
+/*--- c_open -----------------------------------------------------------------*/
+INT c_open(Path)
+ char *Path;
+
+{
+
+ INT rc;
+ INT oFlag;
+ INT oMode;
+#ifdef _CRAY_C90_
+ char fn[256];
+ oFlag=O_CREAT|O_RDWR;
+ (void)strcpy(fn,Path);
+ rc = open(fn,oFlag,0644);
+#else
+#ifndef _WIN32_
+ oFlag=O_CREAT|O_RDWR;
+ oMode=S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR;
+ rc = open(Path,oFlag,oMode);
+#else
+ oFlag=OF_READWRITE;
+ rc=open(Path,oFlag);
+#endif
+#endif
+ if(rc<0) {
+   oFlag=O_RDONLY;
+#ifdef _CRAY_C90_
+   rc = open(fn,oFlag);
+#else
+#ifndef _WIN32_
+   rc = open(Path,oFlag);
+#else
+   oFlag=OF_READ;
+   rc=open(Path,oFlag);
+#endif
+#endif
+ }
+
+ return rc;
+
+}
+/*--- c_open_w -----------------------------------------------------------------*/
+INT c_openw(Path)
+ char *Path;
+
+{
+
+ INT rc;
+ INT oFlag;
+ INT oMode;
+#ifdef _CRAY_C90_
+ char fn[256];
+ oFlag=O_CREAT|O_RDWR|O_TRUNC;
+ (void)strcpy(fn,Path);
+ rc = open(fn,oFlag,0644);
+#else
+#ifndef _WIN32_
+ oFlag=O_CREAT|O_RDWR|O_TRUNC;
+ oMode=S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR;
+ rc = open(Path,oFlag,oMode);
+#else
+ oFlag=OF_READWRITE;
+ rc=open(Path,oFlag);
+#endif
+#endif
+ return rc;
+
+}
+
+/*--- c_close ----------------------------------------------------------------*/
+INT c_close(FileDescriptor)
+ INT *FileDescriptor;
+
+{
+ INT rc;
+ rc = close(*FileDescriptor);
+ return rc;
+}
+
+/*--- c_read -----------------------------------------------------------------*/
+INT c_read(FileDescriptor,Buffer,nBytes)
+ INT *FileDescriptor;
+ char *Buffer;
+ INT *nBytes;
+
+{
+ INT rc=0;
+ INT bfrblk=1024*1024;
+ INT i=0;
+ INT remains;
+ INT readlength;
+ remains=*nBytes;
+ while (remains > 0){
+      readlength = MIN(bfrblk,remains);
+      rc = (INT)read(*FileDescriptor,(void *)(Buffer+i),(size_t)(readlength));
+      if ( rc == readlength ) { i = i+readlength; rc = i; remains = remains - bfrblk;}
+      else { rc = 0; return rc ;}
+ }
+ return rc;
+}
+
+
+/*--- c_pread -----------------------------------------------------------------*/
+INT c_pread(INT *FileDescriptor,char *Buffer,INT *nBytes,INT *Offset) {
+ INT rc=0;
+ rc=(INT) pread((int) *FileDescriptor,(void *) Buffer, (size_t) *nBytes, (off_t) *Offset);
+ return rc;
+}
+
+
+
+/*--- c_write ----------------------------------------------------------------*/
+INT c_write(FileDescriptor,Buffer,nBytes)
+ INT *FileDescriptor;
+ char *Buffer;
+ INT *nBytes;
+
+{
+ INT rc=0;
+ INT bfrblk=1024*1024;
+ INT i=0;
+ INT remains;
+ INT writelength;
+ remains=*nBytes;
+ while (remains > 0){
+      writelength = MIN(bfrblk,remains);
+      rc = (INT)write(*FileDescriptor,(void *)(Buffer+i),(size_t)(writelength));
+      if ( rc == writelength ) { i = i+writelength; rc = i; remains = remains - bfrblk;}
+      else { rc = 0; return rc ;}
+ }
+ return rc;
+}
+
+
+/*--- c_pwrite ----------------------------------------------------------------*/
+INT c_pwrite(INT *FileDescriptor,char *Buffer,INT *nBytes, INT *Offset) {
+INT rc=0;
+
+ rc = (INT) pwrite((int) *FileDescriptor,(void *)(Buffer),(size_t)(*nBytes), (off_t) *Offset);
+ return rc;
+}
+
+
+/*--- c_lseek ----------------------------------------------------------------*/
+INT c_lseek(FileDescriptor,Offset)
+ INT *FileDescriptor;
+ INT *Offset;
+
+{
+#ifdef _WIN32_
+typedef long off_t;
+#endif
+ INT rc;
+ rc = (INT)lseek(*FileDescriptor,(off_t)(*Offset),SEEK_SET);
+ return rc;
+}
+
+/*--- c_remove ---------------------------------------------------------------*/
+INT c_remove(FileName)
+ char *FileName;
+
+{
+ INT rc;
+#ifdef _CAPITALS_
+ char fn[256];
+#endif
+
+#ifdef _CAPITALS_
+ (void)strcpy(fn,FileName);
+ rc = remove(fn);
+#else
+#ifndef _WIN32_
+ rc = remove(FileName);
+#else
+ rc = DeleteFile(FileName);
+#endif
+#endif
+ return rc;
+}
+
+/*--- c_fsync ----------------------------------------------------------------*/
+INT c_fsync(FileDescriptor)
+ INT *FileDescriptor;
+
+{
+ INT rc;
+#ifndef _WIN32_
+ rc = fsync(*FileDescriptor);
+#else
+ rc=0;
+#endif
+ return rc;
+}
+
+/*--- c_copy ----------------------------------------------------------------*/
+INT c_copy(FileDescriptor1, FileDescriptor2)
+ INT *FileDescriptor1, *FileDescriptor2;
+{
+ INT rc;
+ char *Buffer;
+ struct stat stat;
+ size_t rce;
+
+ rc=fstat(*FileDescriptor1, &stat);
+
+ rce=stat.st_size;
+ Buffer=(char*) malloc(sizeof(char)*(rce+1));
+      rc = (INT)read(*FileDescriptor1,(void *)(Buffer),(size_t)(rce));
+      rc = (INT)write(*FileDescriptor2,(void *)(Buffer),(size_t)(rce));
+ free(Buffer);
+ return rc;
+}
+
+/*--- c_stat ----------------------------------------------------------------*/
+INT c_stat(FileDescriptor)
+ INT *FileDescriptor;
+{
+ INT rc;
+ struct stat flstat;
+ off_t fsize;
+
+ rc=fstat(*FileDescriptor, &flstat);
+ (void)rc;
+ fsize=flstat.st_size;
+ return fsize;
+}
+
+/*--- c_rename --------------------------------------------------------------*/
+INT c_rename(FileName,NewName)
+ char *FileName;
+ char *NewName;
+
+{
+ INT rc;
+#ifdef _CAPITALS_
+ char fn[256];
+ char nn[256];
+#endif
+
+#ifdef _CAPITALS_
+ (void)strcpy(fn,FileName);
+ (void)strcpy(nn,FileName);
+ rc = rename(fn,nn);
+#else
+#ifndef _WIN32_
+ rc = rename(FileName,NewName);
+#else
+ rc = MoveFile(FileName,NewName);
+#endif
+#endif
+ return rc;
+}
diff --git a/src/cio.h b/src/cio.h
new file mode 100644
index 0000000000000000000000000000000000000000..e3f43dbc5a6d50790722fe07908f7914589cad69
--- /dev/null
+++ b/src/cio.h
@@ -0,0 +1,75 @@
+/***********************************************************************
+* This file is part of OpenMolcas.                                     *
+*                                                                      *
+* OpenMolcas is free software; you can redistribute it and/or modify   *
+* it under the terms of the GNU Lesser General Public License, v. 2.1. *
+* OpenMolcas is distributed in the hope that it will be useful, but it *
+* is provided "as is" and without any express or implied warranties.   *
+* For more details see the full text of the license in the file        *
+* LICENSE or in <http://www.gnu.org/licenses/>.                        *
+*                                                                      *
+* Copyright (C) 2012-2013, Victor P. Vysotskiy                         *
+*               2020, Ignacio Fdez. Galvan                             *
+***********************************************************************/
+/**************************************************************************/
+/*                                                                        */
+/*              THE NATIVE MOLCAS'S AIX IO LAYER                          */
+/*                                                                        */
+/* Just a header file                                                     */
+/*                                                                        */
+/*------------------------------------------------------------------------*/
+/*                                                                        */
+/* Author:  Victor P. Vysotskiy                                           */
+/*          Lund University, Sweden                                       */
+/* Written: 2012-2013                                                     */
+/*                                                                        */
+/*------------------------------------------------------------------------*/
+/*                                                                        */
+/* History:                                                               */
+/*                                                                        */
+/**************************************************************************/
+#ifdef _CAPITALS_
+#define c_open   C_OPEN
+#define c_openw  C_OPENW
+#define c_close  C_CLOSE
+#define c_read   C_READ
+#define c_pread  C_PREAD
+#define c_write  C_WRITE
+#define c_pwrite C_PWRITE
+#define c_lseek  C_LSEEK
+#define c_remove C_REMOVE
+#define c_fsync  C_FSYNC
+#define c_copy   C_COPY
+#define c_stat   C_STAT
+#define c_rename C_RENAME
+#else
+#ifndef ADD_
+#define c_open   c_open_
+#define c_openw  c_openw_
+#define c_close  c_close_
+#define c_read   c_read_
+#define c_pread  c_pread_
+#define c_write  c_write_
+#define c_pwrite c_pwrite_
+#define c_lseek  c_lseek_
+#define c_remove c_remove_
+#define c_fsync  c_fsync_
+#define c_copy   c_copy_
+#define c_stat   c_stat_
+#define c_rename c_rename_
+#endif
+#endif
+
+INT c_open(char *Path);
+INT c_openw(char *Path);
+INT c_close(INT *FileDescriptor);
+INT c_read(INT *FileDescriptor,char *Buffer,INT *nBytes);
+INT c_pread(INT *FileDescriptor,char *Buffer,INT *nBytes,INT *Offset);
+INT c_write(INT *FileDescriptor,char *Buffer,INT *nBytes);
+INT c_pwrite(INT *FileDescriptor,char *Buffer,INT *nBytes, INT *Offset);
+INT c_lseek(INT *FileDescriptor,INT *Offset);
+INT c_remove(char *FileName);
+INT c_fsync(INT *FileDescriptor);
+INT c_copy(INT *FileDescriptor1, INT *FileDescriptor2);
+INT c_stat(INT *FileDescriptor);
+INT c_rename(char *FileName,char *NewName);
diff --git a/src/compute_hv.F90 b/src/compute_hv.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c7459ac3f1523e1b6dd26c6fbdefc8f041f85eed
--- /dev/null
+++ b/src/compute_hv.F90
@@ -0,0 +1,832 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module compute_hv
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use typetargetvec
+  use utils_intcase
+  use utils_batch
+#ifdef VAR_NOGEN
+  use blocs_hv
+#else
+  use codegen_hv
+#endif
+
+  implicit none
+
+contains
+
+  !$======================================================================== 
+  !> @brief Compute Wm = HVm
+  !> @author Elisa Rebolini
+  !> @date June 2018
+  !
+  !> @param[in] Vm_array 2-dim array Vm(ndet,nvec)
+  !> @param[out] Wm_array 2-dim array Wm(ndet,nvec)
+  !> @param fock Fock matrix in the AO basis
+  !> @param hdiag Diagonal elms of the Hamiltonian matrix
+  !> @param rspin List of the spin-ordered active parts of the determinants
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param v_info Info on the target states
+  !> @param prog_info
+  !> @param nelact Nb of active electrons
+  !> @param ndet Total number of determinants
+  !> @param nvec
+  !> @param hcase_info
+  !> @param pcase_info
+  !> @param hmat
+  !> @param intkindlist
+  !> @param mpilist
+  !$======================================================================== 
+  subroutine compute_HVm(Vm_array, Wm_array, fock, hdiag, rspin, det, o_info, &
+       int_info, prog_info, nelact, ndet, nvec, &
+       hcase_info, pcase_info, hmat, intkindlist, mpilist, iter)
+
+    Integer, intent(in)                                       :: nelact, ndet, nvec, iter
+    real(kd_dble), dimension(1:ndet,1:nvec), intent(in)       :: Vm_array
+    real(kd_dble), dimension(1:ndet,1:nvec), intent(inout)    :: Wm_array
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: hmat
+    real(kd_dble), dimension(:), allocatable, intent(in)      :: hdiag
+    type(spinrlist), intent(in)                               :: rspin
+    type(deter_dblocklist), intent(in)                        :: det
+    type(o_infotype), intent(in)                              :: o_info
+    type(int_infotype), intent(in)                            :: int_info
+    type(prog_infotype), intent(in)                           :: prog_info
+    type(case_infotype), intent(in)                           :: hcase_info(:), pcase_info(:)
+    type(intkind_H), dimension(:), allocatable , intent(in)   :: intkindlist
+    type(int_blockpair_list), intent(in)                      :: mpilist
+
+    integer :: nintkind, i
+    type(vecM) :: Vm, Wm
+    type(intkind_H) :: intkind
+    type(intcase_list) :: intcases
+    real(kd_dble) :: t1, t2, wt1, wt2
+
+#ifdef VAR_MPI
+    real(kd_dble), dimension(1:ndet,1:nvec)   :: Wm_array_mpi
+    real(kd_dble), dimension(1:mpilist%nint_blockpair) :: cputime, wtime
+    type(int_blockpair) :: mpiitem
+    integer :: indx, ierr
+    integer :: nb_cpu, id_cpu
+    integer :: nloop, iloop, indxintkind
+#endif
+
+    call intcaselist_init(intcases, nelact)
+
+#ifdef VAR_NOGEN
+    if (debug) Hmat(:,:) = 0.d0
+#endif
+
+    !Initialisation Vm
+    call vecM_init(Vm,det,nvec)
+    call vecM_from_full(Vm,Vm_array,ndet,nvec)
+
+    !Initialisation Wm
+    call vecM_init(Wm,det,nvec)
+
+    if (prog_info%id_cpu .eq. 0) then
+       ! Ajout de la diagonale
+       call add_diag(Vm, Wm, hdiag, Hmat)
+    endif
+
+#ifdef VAR_MPI
+    
+    cputime(:) = 0.d0
+    wtime(:) = 0.d0
+        
+    nintkind = mpilist%nint_blockpair
+        
+    nb_cpu = prog_info%nb_cpu
+    id_cpu = prog_info%id_cpu
+    nloop = nintkind/nb_cpu
+    do iloop = 1, nloop
+       indx = (iloop - 1)*nb_cpu + id_cpu + 1
+       i = mpilist%indx(indx)   
+       mpiitem = mpilist%l(i)
+       indxintkind = mpiitem%indxintkind
+       intkind = intkindlist(indxintkind) 
+
+       if (.not.(prog_info%restart) .and. (iter .eq. 1)) then         
+          if (mpiitem%indxI .eq. 1) then
+             call compute_HVm_mpiitem(Vm, Wm, intkind, fock, rspin, det, o_info, &
+                  int_info, prog_info, nelact, i, &
+                  hcase_info, pcase_info, hmat, intcases, mpiitem, cputime, wtime, iter)
+          else
+             !Guess vectors only in D00
+          endif
+       else
+          call compute_HVm_mpiitem(Vm, Wm, intkind, fock, rspin, det, o_info, &
+                  int_info, prog_info, nelact, i, &
+                  hcase_info, pcase_info, hmat, intcases, mpiitem, cputime, wtime, iter)
+       endif
+    enddo
+
+    if (mod(nintkind,nb_cpu) .ne. 0) then 
+       indx = nintkind/nb_cpu*nb_cpu + id_cpu + 1
+              
+       if (indx .le. nintkind) then
+          
+          i = mpilist%indx(indx)          
+          mpiitem = mpilist%l(i)
+          indxintkind = mpiitem%indxintkind
+          intkind = intkindlist(indxintkind) 
+
+          if (.not.(prog_info%restart) .and. (iter .eq. 1)) then         
+             if (mpiitem%indxI .eq. 1) then
+                call compute_HVm_mpiitem(Vm, Wm, intkind, fock, rspin, det, o_info, &
+                     int_info, prog_info, nelact, i, &
+                     hcase_info, pcase_info, hmat, intcases, mpiitem, cputime, wtime, iter)
+             endif
+          else
+             call compute_HVm_mpiitem(Vm, Wm, intkind, fock, rspin, det, o_info, &
+                  int_info, prog_info, nelact, i, &
+                  hcase_info, pcase_info, hmat, intcases, mpiitem, cputime, wtime, iter)
+          endif
+       endif
+    endif
+
+    call vecM_to_full(Wm, Wm_array_mpi, ndet, nvec)
+
+    !if (((prog_info%restart) .and. (iter .eq. 1)) .or. &
+    !     ((.not.prog_info%restart) .and. (iter .eq. 2))) then
+       
+    call MPI_ALLREDUCE(cputime, mpilist%cputime, nintkind, &
+         MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
+    call MPI_ALLREDUCE(wtime, mpilist%wtime, nintkind, &
+         MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
+    
+    call MPI_ALLREDUCE(Wm_array_mpi, Wm_array, ndet*nvec, &
+         MPI_DOUBLE_PRECISION, MPI_SUM, MPI_COMM_WORLD, ierr)
+#else
+    nintkind = int_info%CASS_nintkind
+    do i = 1, nintkind
+    
+       intkind = intkindlist(i)
+       call gettime(t1,wt1)
+       call compute_Hvm_intkind(Vm, Wm, intkind, fock, &
+            rspin, det, o_info, int_info, prog_info, nelact, &
+            hcase_info, pcase_info, hmat, intcases)
+       call gettime(t2,wt2)
+       
+    end do
+    call vecM_to_full(Wm, Wm_array,ndet,nvec)
+#endif
+       
+    !Cleanup
+    call intcaselist_free(intcases)
+    call vecM_free(Vm)
+    call vecM_free(Wm)
+
+  end subroutine compute_HVm
+
+   !$======================================================================== 
+  !> @brief Compute Wm = HVm for a given MPI item
+  !> @author Elisa Rebolini
+  !> @date Jan 2020
+  !
+  !> @param[in] Vm_array 2-dim array Vm(ndet,nvec)
+  !> @param[out] Wm_array 2-dim array Wm(ndet,nvec)
+  !> @param fock Fock matrix in the AO basis
+  !> @param hdiag Diagonal elms of the Hamiltonian matrix
+  !> @param rspin List of the spin-ordered active parts of the determinants
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param v_info Info on the target states
+  !> @param nelact Nb of active electrons
+  !> @param ndet Total number of determinants
+  !$======================================================================== 
+  subroutine compute_HVm_mpiitem(Vm, Wm, intkind, fock, rspin, det, o_info, &
+       int_info, prog_info, nelact, i, &
+       hcase_info, pcase_info, hmat, intcases, mpiitem, cputime, wtime, iter)
+
+    type(vecM), intent(in)                                    :: Vm
+    type(vecM), intent(inout)                                 :: Wm
+    type(intkind_H), intent(in)                               :: intkind
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: hmat
+    Integer, intent(in)                                       :: nelact, i, iter
+    type(spinrlist), intent(in)                               :: rspin
+    type(deter_dblocklist), intent(in)                        :: det
+    type(o_infotype), intent(in)                              :: o_info
+    type(int_infotype), intent(in)                            :: int_info
+    type(prog_infotype), intent(in)                           :: prog_info
+    type(case_infotype), intent(in)                           :: hcase_info(:), pcase_info(:)
+    type(intcase_list), intent(in)                            :: intcases
+    type(int_blockpair), intent(in)                           :: mpiitem
+    real(kd_dble), dimension(:), intent(inout)                :: cputime, wtime
+      
+    real(kd_dble) :: t1, t2, wt1, wt2, read_time
+    
+    call gettime(t1,wt1)
+    call compute_Hvm_intkind_IJ(Vm, Wm, intkind, mpiitem%indxI, &
+         mpiitem%indxJ, mpiitem%spincase, mpiitem%pmin, mpiitem%pmax, fock, &
+         rspin, det, o_info, int_info, prog_info, nelact, &
+         hcase_info, pcase_info, hmat, intcases, read_time)
+    call gettime(t2,wt2)
+
+    cputime(i) = t2-t1
+    wtime(i) = wt2-wt1
+    
+    if (prog_info%iprint.gt.0) then
+
+       if ((wt2-wt1) .gt. 1d-12) then
+          write(*,'(3(F12.4,A),2A,I3,4(A,I3),A,I4,A,I3,A, F12.4)') &
+               t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+               mpiitem%intkind, ' : D',det%detblock(mpiitem%indxI)%p%name, &
+               ' : D',det%detblock(mpiitem%indxJ)%p%name,' : spin ',&
+               mpiitem%spincase, ' : pmin ', mpiitem%pmin, ' : pmax ', mpiitem%pmax, &
+               ' : Job ',i,' : CPU ',prog_info%id_cpu, ' : Read time ', read_time
+       else
+          write(*,'(3(F12.4,A),2A,I3,4(A,I3),A,I4,A,I3,A, F12.4)') &
+               t2-t1,' : ', wt2-wt1,' : ', 0d0,' : ', &
+               mpiitem%intkind, ' : D',det%detblock(mpiitem%indxI)%p%name, &
+               ' : D',det%detblock(mpiitem%indxJ)%p%name,' : spin ',&
+               mpiitem%spincase, ' : pmin ', mpiitem%pmin, ' : pmax ', mpiitem%pmax, &
+               ' : Job ',i,' : CPU ',prog_info%id_cpu, ' : Read time ', read_time
+       endif
+    endif
+       
+  end subroutine compute_HVm_mpiitem
+
+  !$======================================================================== 
+  !> @brief Compute Wm = HVm for a given blockpair IJ in MPI
+  !> @author Elisa Rebolini
+  !> @date June 2018
+  !
+  !> @param[in] Vm 2-dim array Vm(ndet,nvec)
+  !> @param[out] Wm 2-dim array Wm(ndet,nvec)
+  !> @param fock Fock matrix in the AO basis
+  !> @param hdiag Diagonal elms of the Hamiltonian matrix
+  !> @param rspin List of the spin-ordered active parts of the determinants
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param v_info Info on the target states
+  !> @param nelact Nb of active electrons
+  !> @param ndet Total number of determinants
+  !$======================================================================== 
+  subroutine compute_Hvm_intkind_IJ(Vm, Wm, intkind, indxI, indxJ, spincase, pmin, pmax, fock, &
+       rspin, det, o_info, int_info, prog_info, nelact, &
+       hcase_info, pcase_info, hmat, intcases, read_time)
+
+    integer, intent(in)                        :: nelact, spincase, pmin, pmax
+    type(vecM), intent(in)                     :: Vm
+    type(vecM), intent(inout)                  :: Wm
+    real(kd_dble), dimension(:,:), allocatable, intent(in) :: fock
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: hmat
+    type(intkind_H), intent(in)                :: intkind
+    type(spinrlist), intent(in)                :: rspin
+    type(deter_dblocklist), intent(in)         :: det
+    type(o_infotype), intent(in)               :: o_info
+    type(int_infotype), intent(in)             :: int_info
+    type(prog_infotype), intent(in)            :: prog_info
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intcase_list), intent(in)             :: intcases
+    real(kd_dble), intent(out)                 :: read_time
+
+    real(kd_dble) :: t1, t2, wt1, wt2
+    type(intblock) :: twoint, twointx
+    integer :: indxI, ndetI, spinindxI, indxJ, ndetJ, spinindxJ
+    type(vecMblock), pointer :: VmI, VmJ, WmI, WmJ
+    type(deter_dblock), pointer :: DblockI, DblockJ
+    type(spindetact_list), pointer :: spinrefI, spinrefJ
+
+
+    read_time = 0.d0
+    
+    DblockI => det%detblock(indxI)%p
+    ndetI = DblockI%ndet
+
+    if (ndetI.ne.0) then
+
+       !Get the determinant block J
+       DblockJ => det%detblock(indxJ)%p
+       ndetJ = DblockJ%ndet
+
+       if (ndetJ.ne.0) then
+
+          if (intkind%name .ne. 'fock') then
+
+             call gettime(t1,wt1)
+             call get_twoint(twoint, intkind%name, o_info, int_info, prog_info%id_cpu)
+             if (intkind%lintx) then
+                call get_twoint(twointx, intkind%namex, o_info, int_info, prog_info%id_cpu)
+             endif
+             call gettime(t2,wt2)
+
+             read_time = wt2 - wt1
+          
+          endif
+          
+
+          VmI => Vm%vecblock(indxI)%p
+          WmI => Wm%vecblock(indxI)%p
+          !Get the Active parts for I
+          spinindxI = get_Rspinindx(dblockI%nelCAS)
+          spinrefI => rspin%l(spinindxI)%p
+
+
+          VmJ => Vm%vecblock(indxJ)%p
+          WmJ => Wm%vecblock(indxJ)%p
+          !Get the Active parts for J
+          spinindxJ = get_Rspinindx(dblockJ%nelCAS)
+          spinrefJ => rspin%l(spinindxJ)%p
+
+#ifdef VAR_NOGEN
+          call hv_blocs(VmI, spinrefI, dblockI, indxI, &
+               WmJ, spinrefJ, dblockJ, indxJ, fock, o_info, &
+               nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hmat)
+
+          if (indxI .ne. indxJ) then
+             call hv_blocs(VmJ, spinrefJ, dblockJ, indxJ, &
+                     WmI, spinrefI, dblockI, indxI, fock, o_info, &
+                     nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hmat)
+          endif
+
+             
+#else
+          call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+               VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+               nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases)
+#endif
+
+
+
+          if (intkind%name .ne. 'fock') then
+             call intblock_free(twoint)
+             if (intkind%lintx) call intblock_free(twointx)
+          end if
+
+       endif
+    endif
+  end subroutine compute_Hvm_intkind_IJ
+
+  !$======================================================================== 
+  !> @brief Compute Wm = HVm -- used in the non-MPI case
+  !> @author Elisa Rebolini
+  !> @date June 2018
+  !
+  !> @param[in] Vm 2-dim array Vm(ndet,nvec)
+  !> @param[out] Wm 2-dim array Wm(ndet,nvec)
+  !> @param[in] fock Fock matrix in the AO basis
+  !> @param[inout] hmat (for debug only)
+  !> @param rspin List of the spin-ordered active parts of the determinants
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param prog_info 
+  !> @param nelact Nb of active electrons
+  !> @param hcase_info
+  !> @param pcase_info
+  !> @param intcases
+  !$======================================================================== 
+  subroutine compute_Hvm_intkind(Vm, Wm, intkind, fock, &
+       rspin, det, o_info, int_info, prog_info, nelact, &
+       hcase_info, pcase_info, hmat, intcases)
+
+    integer, intent(in)                                       :: nelact
+    type(vecM), intent(in)                                    :: Vm
+    type(vecM), intent(inout)                                 :: Wm
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: hmat
+    type(intkind_H), intent(in)                               :: intkind
+    type(spinrlist), intent(in)                               :: rspin
+    type(deter_dblocklist), intent(in)                        :: det
+    type(o_infotype), intent(in)                              :: o_info
+    type(int_infotype), intent(in)                            :: int_info
+    type(prog_infotype), intent(in)                           :: prog_info
+    type(case_infotype), intent(in)                           :: hcase_info(:), pcase_info(:)
+
+    type(intblock) :: twoint, twointx
+    integer :: indxI, ndetI, spinindxI, indxJ, ndetJ, spinindxJ, spincase, pmin, pmax
+    type(vecMblock), pointer :: VmI, WmI, VmJ, WmJ, Vmdumb, Wmdumb
+    type(deter_dblock), pointer :: DblockI, DblockJ
+    type(spindetact_list), pointer :: spinrefI, spinrefJ
+    type(intcase_list) :: intcases
+
+    real(kd_dble) :: t1, t2, wt1, wt2
+
+    logical :: symblock
+
+    pmin = 0
+    pmax = o_info%nligv + o_info%nvirt
+    
+    if (intkind%name .ne. 'fock') then
+       call get_twoint(twoint, intkind%name, o_info, int_info, prog_info%id_cpu)
+       if (intkind%lintx) then
+          call get_twoint(twointx, intkind%namex, o_info, int_info, prog_info%id_cpu)
+       endif
+    endif
+
+    do indxI = 1, det%nblock
+       !IndxI = 1
+       DblockI => det%detblock(indxI)%p
+       ndetI = DblockI%ndet
+
+       if (ndetI.ne.0) then
+          VmI => Vm%vecblock(indxI)%p
+          WmI => Wm%vecblock(indxI)%p
+          !Get the Active parts for I
+          spinindxI = get_Rspinindx(dblockI%nelCAS)
+          spinrefI => rspin%l(spinindxI)%p
+
+          !Get the determinant block J
+          !indxI = indxJ
+#ifdef VAR_NOGEN
+
+          call hv_blocs(VmI, spinrefI, dblockI, indxI, &
+               WmI, spinrefI, dblockI, indxI, fock, o_info, &
+               nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hmat)
+#else
+          if (dblockI%nexcVirt .eq. 2) then
+             do spincase = 1, 4
+                call gettime(t1,wt1)
+                call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                     VmI, WmI, spinrefI, dblockI, indxI, spincase, pmin, pmax, fock, o_info, &
+                     nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases)
+                if (prog_info%iprint .gt. 0) then
+                   call gettime(t2,wt2)
+                   if (wt2-wt1 .gt. 0) then
+                      write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                           intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                   else
+                      write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                           intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                   end if
+                   flush(667)
+                endif
+             enddo
+          else if (dblockI%nexcVirt .eq. 1) then
+             do spincase = 1, 2
+                call gettime(t1,wt1)
+                call hv_blocs_gen(VmI, Wmdumb, spinrefI, dblockI, indxI, &
+                     VmI, WmI, spinrefI, dblockI, indxI, spincase, pmin, pmax, fock, o_info, &
+                     nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases)
+                if (prog_info%iprint .gt. 0) then
+                   call gettime(t2,wt2)
+                   if (wt2-wt1 .gt. 0) then
+                      write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                           intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                   else
+                      write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                           intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                   end if
+                   flush(667)
+                endif
+             enddo
+          else 
+             spincase = 1
+             
+             call gettime(t1,wt1)
+             call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                  VmI, WmI, spinrefI, dblockI, indxI, spincase, pmin, pmax, fock, o_info, &
+                  nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases)
+             if (prog_info%iprint .gt. 0) then
+                call gettime(t2,wt2)
+                if (wt2-wt1 .gt. 0) then
+                   write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                        intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                else
+                   write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                        intkind%name, ' : D',DblockI%name,' : D',DblockI%name,' : spin ', spincase
+                endif
+                flush(667)
+             endif
+          endif
+#endif
+
+          !indxI < IndxJ
+          do indxJ = indxI+1, det%nblock
+             !indxJ = 1
+             DblockJ => det%detblock(indxJ)%p
+             ndetJ = DblockJ%ndet
+
+             if (ndetJ.ne.0) then
+                VmJ => Vm%vecblock(indxJ)%p
+                WmJ => Wm%vecblock(indxJ)%p
+
+                !Get the Active parts for J
+                spinindxJ = get_Rspinindx(dblockJ%nelCAS)
+                spinrefJ => rspin%l(spinindxJ)%p
+
+#ifdef VAR_NOGEN
+                ! I < J
+                call hv_blocs(VmI, spinrefI, dblockI, indxI, &
+                     WmJ, spinrefJ, dblockJ, indxJ, fock, o_info, &
+                     nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hmat)
+                ! I > J
+                call hv_blocs(VmJ, spinrefJ, dblockJ, indxJ, &
+                     WmI, spinrefI, dblockI, indxI, fock, o_info, &
+                     nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hmat)
+
+
+#else
+                symblock = direct_or_sym(DblockI, DblockJ)
+
+                if (symblock) then
+                   if (dblockJ%nexcVirt .eq. 2) then
+                      do spincase = 1, 4
+                         call gettime(t1,wt1)
+                         call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                              VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                              nelact, hcase_info, pcase_info, intkind, &
+                              twoint, twointx, intcases)
+                         if (prog_info%iprint .gt. 0) then
+                            call gettime(t2,wt2)
+                            if (wt2-wt1 .gt. 0) then
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            else
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            endif
+                            flush(667)
+                         endif
+
+                      enddo
+                   else if (dblockJ%nexcVirt .eq. 1) then
+                      do spincase = 1, 2
+                         call gettime(t1,wt1)
+                         call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                              VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                              nelact, hcase_info, pcase_info, intkind, &
+                              twoint, twointx, intcases)
+                         if (prog_info%iprint .gt. 0) then
+                            call gettime(t2,wt2)
+                            if (wt2-wt1 .gt. 0) then
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            else
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            endif
+                            flush(667)
+                         endif
+                      enddo
+                   else 
+                      spincase = 1
+                      call gettime(t1,wt1)
+                      call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                           VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                           nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases)
+                      if (prog_info%iprint .gt. 0) then
+                         call gettime(t2,wt2)
+                         if (wt2-wt1 .gt. 0) then
+                            write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                 intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                         else
+                            write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                 intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                         endif
+                         flush(667)
+                      endif
+                   endif
+                else
+                   if (dblockI%nexcVirt .eq. 2) then
+                      do spincase = 1, 4
+                         call gettime(t1,wt1)
+                         call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                              VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                              nelact, hcase_info, pcase_info, intkind, &
+                              twoint, twointx, intcases)
+                         if (prog_info%iprint .gt. 0) then
+                            call gettime(t2,wt2)
+                            if (wt2-wt1 .gt. 0) then
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            else
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            endif
+                            flush(667)
+                         endif
+                      enddo
+                   else if (dblockI%nexcVirt .eq. 1) then
+                      do spincase = 1, 2
+                         call gettime(t1,wt1)
+                         call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                              VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                              nelact, hcase_info, pcase_info, intkind, &
+                              twoint, twointx, intcases)
+                         if (prog_info%iprint .gt. 0) then
+                            call gettime(t2,wt2)
+                            if (wt2-wt1 .gt. 0) then
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            else
+                               write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                    intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                            endif
+                            flush(667)
+                         endif
+                      enddo
+                   else 
+                      spincase = 1
+                      call gettime(t1,wt1)
+                      call hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+                           VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+                           nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases)
+                      if (prog_info%iprint .gt. 0) then
+                         call gettime(t2,wt2)
+                         if (wt2-wt1 .gt. 0) then
+                            write(667,*) t2-t1,' : ', wt2-wt1,' : ', (t2-t1)/(wt2-wt1),' : ', &
+                                 intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                         else
+                            write(667,*) t2-t1,' : ', wt2-wt1,' : ', 0.0 ,' : ', &
+                                 intkind%name, ' : D',DblockI%name,' : D',DblockJ%name,' : spin ', spincase
+                         endif
+                         flush(667)
+                      endif
+                   endif
+                endif
+#endif
+
+             endif
+          enddo
+       endif
+    enddo
+
+    if (intkind%name .ne. 'fock') then
+       call intblock_free(twoint)
+       if (intkind%lintx) call intblock_free(twointx)
+    end if
+
+  end subroutine compute_Hvm_intkind
+
+
+!!$======================================================================== 
+  !> @brief  add_diag(Vm,Wm)
+  !> @author MBL
+  !> @date November 2018
+  !
+  !> @param[in] Vm, Wm, type vecM, input and output vertors
+  !> @param[in] Add the diagobal elements
+  !> @param[in] Wm = Wm + Vm*hdiag
+  !$======================================================================== 
+  subroutine add_diag(V,W,hdiag,Hmat)
+    type(vecM), intent(in) :: v
+    type(vecM), intent(inout) :: w
+    real(kd_dble), dimension(:), intent(in)  :: hdiag
+    real(kd_dble), dimension(:,:) :: hmat
+
+    type(vecMblock), pointer :: Vblock, Wblock
+    integer :: iblock, isft
+    integer :: idet,ivec,nblocks, ndetblock,nvecblocs
+
+    nblocks =  v%ndblock
+
+    isft = 0
+    do iblock = 1, nblocks
+       vblock => v%vecblock(iblock)%p
+       Wblock => W%vecblock(iblock)%p
+       ndetblock = vblock%ndet
+       nvecblocs = vblock%nvec
+
+       if (ndetblock .ne. 0) then
+          do idet = 1, ndetblock
+             do ivec = 1, nvecblocs
+                Wblock%elms(ivec,idet) = Wblock%elms(ivec,idet) &
+                     + vblock%elms(ivec,idet)*hdiag(idet+isft)
+#ifdef VAR_NOGEN
+                if (debug) Hmat(idet+isft, idet+isft) = hdiag(idet+isft)
+#endif
+             end do
+          end do
+          isft = isft + ndetblock
+       end if
+    end do
+
+  end subroutine add_diag
+!!$======================================================================== 
+  !> @brief Compute Wm = HVm from mat (for debug purposes)
+  !> @author MBL
+  !> @date November 2018
+  !
+  !> @param[in] Vm_array 2-dim array Vm(ndet,nvec)
+  !> @param[out] Wm_array 2-dim array Wm(ndet,nvec)
+  !> @param det List of blocks of determinants D_m^n
+  !> @param o_info Orbital information
+  !> @param int_info Integral information
+  !> @param v_info Info on the target states
+  !> @param ndet Total number of determinants
+  !> @param nvec
+  !> @param hmat
+  !$======================================================================== 
+  subroutine compute_HVm_mat(Vm_array, Wm_array, det, ndet, nvec, hmat)
+
+    integer, intent(in)                        :: ndet, nvec
+    real(kd_dble), dimension(1:ndet,1:nvec)    :: Vm_array, Wm_array
+    real(kd_dble), dimension(:,:), allocatable :: hmat
+    type(deter_dblocklist), intent(in)         :: det
+    
+    integer :: i
+    type(vecM) :: Vm, Wm
+    type(vecMblock), pointer :: Vmblock, Wmblock
+    integer :: iVmblock,  iWmblock, iVmsft, iWmsft
+    integer :: iVmdet,iWmdet,ivec, nblocks, ndetVmblock,ndetWmblock
+
+    !Initialisation Vm
+    call vecM_init(Vm,det,nvec)
+    call vecM_from_full(Vm,Vm_array,ndet,nvec)
+
+    !Initialisation Wm
+    call vecM_init(Wm,det,nvec)
+
+    ! Read Hmat
+    Hmat(:,:) = 0.d0
+    rewind(f_mat)
+    do i = 1, ndet
+       read(f_mat,*) Hmat(i,:)
+    end do
+
+    ! Wm = Hmat*Vm
+    nblocks =  Vm%ndblock
+    if (Wm%ndblock.ne.nblocks) &
+         call SASS_quit(">>>> erreur Vm%ndblock .ne. Wm%ndblock",f_output)
+    iWmsft = 0
+    do iWmblock = 1, nblocks
+       Wmblock => Wm%vecblock(iWmblock)%p
+       ndetWmblock = Wmblock%ndet
+       if (nvec.ne.Wmblock%nvec) &
+            call SASS_quit(">>>> erreur Wmndblock%nvec .ne. nvec",f_output)
+       if (ndetWmblock .ne. 0) then
+          iVmsft = 0
+          do iVmblock = 1, nblocks
+             Vmblock => Vm%vecblock(iVmblock)%p
+             ndetVmblock = Vmblock%ndet
+             if (nvec.ne.Vmblock%nvec) &
+                  call SASS_quit(">>>> erreur Vmndblock%nvec .ne. nvec",f_output)
+             if (ndetVmblock .ne. 0) then
+                do iWmdet = 1, ndetWmblock
+                   do iVmdet = 1, ndetVmblock
+                      do ivec = 1, nvec
+                         Wmblock%elms(ivec,iWmdet) = Wmblock%elms(ivec,iWmdet) + &
+                              Vmblock%elms(ivec,iVmdet)*hmat(iWmdet+iWmsft,iVmdet+iVmsft)
+                      end do
+                   end do
+                end do
+                iVmsft = iVmsft + ndetVmblock
+             end if
+          end do
+          iWmsft = iWmsft + ndetWmblock
+       end if
+    end do
+
+    call vecM_to_full(Wm, Wm_array,ndet,nvec)
+
+    !Cleanup
+    call vecM_free(Vm)
+    call vecM_free(Wm)
+
+  end subroutine compute_HVm_mat
+
+end module compute_hv
+
+ 
diff --git a/src/def_files.F90 b/src/def_files.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e4719d54f3159c005df241a6e519dc463cb5369a
--- /dev/null
+++ b/src/def_files.F90
@@ -0,0 +1,338 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!> @brief Generate the file names and open them
+!> @author Marie-Bernadette Lepetit
+subroutine def_files(prog_info)
+!!$ Défini les noms de fichiers
+!!$ Fait les open  
+!!$ -------- Donness globales ---------------------------------
+  use files
+  use utils_char
+  use info
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+
+  type(prog_infotype), intent(inout) :: prog_info
+
+  Integer :: n
+  Character*2 :: file_input
+  Character*3 :: file_output, file_det, file_mat
+  Character*4 :: file_fock,  file_bmat, file_ref0, file_mat2, file_bdet, file_info
+  Character*6 :: file_traone, file_traint
+  Character*7 :: file_restart
+  Character*40 :: blan40
+
+  CHARACTER(LEN=8)     :: date      ! returned values from DATE_AND_TIME()
+  CHARACTER(LEN=10)    :: time
+  CHARACTER(LEN=5)     :: zone
+  INTEGER,DIMENSION(8) :: values
+
+  logical :: lexist_mat
+  Character*40 :: filename_mat
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$ doit definir les noms de fichiers à  associer aux unites logiques
+
+!!$-----
+!!$----- Initialisations 
+!!$-----
+  blan40='                                        '
+  file_input  = "in"
+  file_output = "out"
+  
+  file_info   = "sass"
+  file_ref0   = "ref0"
+
+  file_fock   = "fock"  
+  file_traone = "TraOne"
+  file_traint = "TraInt"
+  
+  file_det    = "det"
+  file_bdet   = "bdet"
+  
+  file_restart= "restart" ! infos pour restart de la procedure de Davidson
+  
+  file_bmat   = "bmat" !Hamiltonian matrix in binary format
+  file_mat    = "mat" !Hamiltonian matrix
+  file_mat2   = "mat2" !Hamiltonian matrix with indices
+
+  !file_hcore  = "hcore"
+  !file_cipci  = "ref_cipci"
+  !file_rho    = "rho" ! Density matrix
+  !file_infomolcas = "info"
+  
+!!$-----
+!!$----- Transferts de donnes depuis Molcas ou autre
+!!$-----
+  open(f_input,file="INPUT",form="formatted")
+  call read_sassinp(f_input, prog_info)
+
+  ! Ouverture du fichier de sortie
+  if (prog_info%Yprefix) then
+     call noblancs(prog_info%prefix,n)
+     if (prog_info%id_cpu.eq.0) then
+        open (unit=f_output,file=prog_info%prefix(1:n)//"."//file_output, &
+             form="formatted")
+     endif
+  else
+     if (prog_info%id_cpu.eq.0) then
+        open (f_output,file=file_output,form="formatted")
+     end if
+  endif
+
+  if (prog_info%id_cpu.eq.0) then
+     ! Premières impressions
+     write(f_output,*) '***********************************************'
+     write(f_output,*)
+     write(f_output,*) "  Relaxed Selected Excitation (RelaxSE)"
+     write(f_output,*)
+     write(f_output,*) "  The RelaxSE project is distributed under https://spdx.org/licenses/LGPL-3.0-or-later.html"
+     write(f_output,*)
+     write(f_output,*) "  Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE"
+     write(f_output,*) "                           Institut Neel, (CNRS), Grenoble, FRANCE"
+     write(f_output,*)
+     write(f_output,*) "  Authors: Elisa REBOLINI (ILL)            rebolini@ill.fr"
+     write(f_output,*) "           Marie-Bernadette LEPETIT (CNRS) Marie-Bernadette.Lepetit@neel.cnrs.fr"
+     write(f_output,*)
+     write(f_output,*) '***********************************************'
+#ifdef VAR_DEBUG
+     write(f_output,'(A,L1)') ' DEBUG Version', debug
+#else
+     write(f_output,'(A)') ' RELEASE Version'
+#endif
+#ifdef VAR_MPI
+     write(f_output,'(A,I0,A)') ' MPI version - running on ',&
+          prog_info%nb_cpu,' CPUs'
+#endif
+#ifdef VAR_OMP
+     write(f_output,'(A,I0,A)') ' OMP version - running on ',&
+          prog_info%nb_thread,' threads'
+#endif
+     call date_and_time(date, time, zone, values)
+     write(f_output,*) 'Calculation started on ', date(7:8),'-',date(5:6),&
+          '-',date(1:4), ' at ', time(1:2),':',time(3:4)
+     write(f_output,*)
+
+     write(f_output,'(X,2A)') '>>> Method ',prog_info%method
+
+     write(f_output,*) ">>> Ouverture des fichiers"
+     write(f_output,9001) file_output, prog_info%prefix(1:n)//"."//file_output
+  endif
+
+  if (prog_info%Yprefix) then
+     if (prog_info%iprint .gt. 1) then
+        open (f_fock,file=prog_info%prefix(1:n)//"."//file_fock,&
+             form="formatted")
+     endif
+     open (f_ref0,file=prog_info%prefix(1:n)//"."//file_ref0,&
+          form="formatted")
+     open (f_det,file=prog_info%prefix(1:n)//"."//file_det,&
+          form="formatted")
+     open (f_bdet,file=prog_info%prefix(1:n)//"."//file_bdet,&
+          form="unformatted")
+     open (f_info,file=prog_info%prefix(1:n)//"."//file_info,&
+          form="unformatted")
+     open (f_restart,file=prog_info%prefix(1:n)//"."//file_restart,&
+          form="unformatted")
+
+     if (prog_info%lreadHmat) then
+        write(filename_mat,'(3A)') prog_info%prefix(1:n),".",file_mat
+        inquire(file=filename_mat, exist=lexist_mat)
+        if (.not. lexist_mat) &
+             call SASS_quit('lreadHmat requires in .mat file in input',f_output)
+     endif
+
+     open (f_mat,file=prog_info%prefix(1:n)//"."//file_mat,form="formatted")
+     open (f_mat2,file=prog_info%prefix(1:n)//"."//file_mat2,form="formatted")
+     open (f_bmat,file=prog_info%prefix(1:n)//"."//file_bmat,form="unformatted")
+     
+!!$     if (prog_info%prt_cipci) then
+!!$        open (f_cipci,file=prog_info%prefix(1:n)//"."//file_cipci, &
+!!$             form="formatted")
+!!$     end if
+
+
+     if (prog_info%id_cpu.eq.0) then
+        if (prog_info%iprint .gt. 1) then
+           write(f_output,9001) file_fock, prog_info%prefix(1:n)//"."//file_fock
+        endif
+        write(f_output,9001) file_ref0, prog_info%prefix(1:n)//"."//file_ref0
+        write(f_output,9001) file_det, prog_info%prefix(1:n)//"."//file_det
+        write(f_output,9001) file_bdet, prog_info%prefix(1:n)//"."//file_bdet
+        write(f_output,9001) file_info, prog_info%prefix(1:n)//"."//file_info
+        write(f_output,9001) file_restart, prog_info%prefix(1:n)//"."//file_restart
+        write(f_output,9001) file_mat, prog_info%prefix(1:n)//"."//file_mat
+        write(f_output,9001) file_mat2, prog_info%prefix(1:n)//"."//file_mat2
+        write(f_output,9001) file_bmat, prog_info%prefix(1:n)//"."//file_bmat
+        
+!!$        if (prog_info%prt_cipci) then
+!!$           write(f_output,9001) file_cipci, prog_info%prefix(1:n)//"."//file_cipci
+!!$        endif
+     endif
+  else
+     if (prog_info%iprint .gt. 1) then
+        open (f_fock,file=file_fock,form="formatted")
+     endif
+     open (f_ref0,file=file_ref0,form="formatted")
+     open (f_det,file=file_det,form="formatted")
+     open (f_bdet,file=file_bdet,form="unformatted")
+     open (f_info,file=file_info,form="unformatted")
+     open (f_restart,file=file_restart,form="unformatted")
+     
+     open (f_mat,file=file_mat,form="formatted")
+     open (f_mat2,file=file_mat2,form="formatted")
+     open (f_bmat,file=file_bmat,form="unformatted")
+!!$     if (prog_info%prt_cipci) then
+!!$        open (f_cipci,file=file_cipci,form="formatted")
+!!$     endif
+
+     if (prog_info%id_cpu.eq.0) then
+        if (prog_info%iprint .gt. 1) then
+           write(f_output,9001) file_fock, file_fock
+        endif
+        write(f_output,9001) file_ref0, file_ref0
+        write(f_output,9001) file_det, file_det
+        write(f_output,9001) file_bdet, file_bdet
+        write(f_output,9001) file_info, file_info
+        write(f_output,9001) file_restart, file_restart
+        write(f_output,9001) file_mat, file_mat
+        write(f_output,9001) file_mat2, file_mat2
+        write(f_output,9001) file_bmat, file_bmat
+        
+!!$        if (prog_info%Yprefix) then
+!!$           write(f_output,9001) file_cipci, file_cipci
+!!$        endif
+     endif
+  end if
+
+  
+
+!!$==================================================================== 
+9001 format(a5," :",a80)
+End subroutine def_files
+
+
+!$====================================================================
+!> @brief Read the SASS input and store it in the prog_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] prog_info Type for all program info
+!$====================================================================
+subroutine read_sassinp(iunit, prog_info)
+
+  use dimensions
+  !use donnees
+  use utils_char
+  use info
+
+  implicit none
+
+  integer, intent(in)                :: iunit
+  type(prog_infotype), intent(inout) :: prog_info
+
+  Character*40 :: blan40
+  integer :: n
+  character*8 :: method
+  Logical :: Yprefix, prt_cipci, print_det, restart
+  logical :: lexplicitHmat, lreadHmat, mpi_load_balance
+  Character*40 :: prefix
+  Integer (KIND=kd_int) :: iprint, idiag, iprintHmat, sizebatch
+  logical, dimension(9) :: nodet_block
+
+  namelist /sassinp/  prefix, iprint, idiag, print_det, &
+       prt_cipci, method, restart, lexplicitHmat, lreadHmat, mpi_load_balance, nodet_block, &
+       iprintHmat, sizebatch
+
+  !Initialisation 
+  blan40='                                        '
+  method="SAS+S"
+  Yprefix =.false.
+  iprint = 0
+  idiag = 1
+  print_det = .false.
+  prt_cipci = .false.
+  prefix = blan40
+  restart = .false.
+  lexplicitHmat = .false.
+  lreadHmat = .false.
+  iprintHmat = 0
+  mpi_load_balance = .true.
+  sizebatch = 40
+  nodet_block = (/ .false., .false., .false., .false., .false., &
+       .false., .false., .false., .false. /)
+  
+  read(iunit, sassinp)
+
+  if (prefix.ne.blan40) then 
+     Yprefix = .true.
+     !call lowercase(prefix)
+     call noblancs(prefix,n)
+  end if
+
+  prog_info%Yprefix = Yprefix
+  prog_info%prefix = prefix(1:n)
+  
+  prog_info%iprint = iprint
+  prog_info%idiag = idiag
+  prog_info%print_det = print_det
+  if (prt_cipci) then
+     call SASS_quit('Print cipci not implemented',6)
+  endif
+  prog_info%prt_cipci = prt_cipci
+  
+  call lowercase(method)
+  call noblancs(method,n)
+  prog_info%method = method(1:n)
+  prog_info%methodAct = method(1:3)
+  prog_info%methodExc = method(5:n)
+  
+  prog_info%restart = restart
+  prog_info%lexplicit = lexplicitHmat
+  prog_info%lreadHmat = lreadHmat
+  prog_info%iprintHmat = iprintHmat
+  prog_info%sizebatch = sizebatch
+  prog_info%mpi_load_balance = mpi_load_balance
+  prog_info%nodet_block = nodet_block
+
+#ifndef VAR_NOGEN
+  if (iprintHmat .gt. 0) then
+     call SASS_quit('Only possible to print Hmat when compiled with --nogen',6)
+  endif
+#endif
+  
+end subroutine read_sassinp
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/def_files_prop.F90 b/src/def_files_prop.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5d7e31918e62878cf473371240b7db6ff82e865f
--- /dev/null
+++ b/src/def_files_prop.F90
@@ -0,0 +1,169 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!> @brief Generate the file names and open them
+!> @author Marie-Bernadette Lepetit
+subroutine def_files_prop(prog_info)
+!!$ Défini les noms de fichiers
+!!$ Fait les open  
+!!$ -------- Donness globales ---------------------------------
+  use files
+  use utils_char
+  use info
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+
+  type(prog_infotype), intent(inout) :: prog_info
+
+  Integer :: n
+  Character*3 :: file_det!, file_rho
+  Character*4 :: file_bdet, file_info, file_ref0
+  Character*6 :: file_input
+  Character*7 :: file_restart, file_output
+  Character*40 :: blan40
+
+  CHARACTER(LEN=8)     :: date      ! returned values from DATE_AND_TIME()
+  CHARACTER(LEN=10)    :: time
+  CHARACTER(LEN=5)     :: zone
+  INTEGER,DIMENSION(8) :: values
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$ doit definir les noms de fichiers à  associer aux unites logiques
+
+!!$-----
+!!$----- Initialisations 
+!!$-----
+  blan40='                                        '
+  file_input  = "propin"
+  file_output = "propout"
+  file_bdet   = "bdet"
+  file_info   = "sass"
+  file_ref0   = "ref0"
+!  file_rho    = "rho" ! Density matrix
+  file_restart= "restart" ! infos pour restart de la procedure de Davidson
+
+  !$-----
+!!$----- Transferts de donnes depuis Molcas ou autre
+!!$-----
+  open(f_input,file="INPUT",form="formatted")
+  call read_sassinp(f_input, prog_info)
+
+  ! Ouverture du fichier de sortie
+  if (prog_info%Yprefix) then
+     call noblancs(prog_info%prefix,n)
+     if (prog_info%id_cpu.eq.0) then
+        open (unit=f_output,file=prog_info%prefix(1:n)//"."//file_output, &
+             form="formatted")
+     endif
+  else
+     if (prog_info%id_cpu.eq.0) then
+        open (f_output,file=file_output,form="formatted")
+     end if
+  endif
+
+  if (prog_info%id_cpu.eq.0) then
+     ! Premières impressions
+     write(f_output,*) '***********************************************'
+     write(f_output,*)
+     write(f_output,*) "        Programme  PROPRIETES du SASS"
+     write(f_output,*)
+     write(f_output,*) '***********************************************'
+#ifdef VAR_DEBUG
+     write(f_output,'(A,L1)') ' DEBUG Version', debug
+#else
+     write(f_output,'(A)') ' RELEASE Version'
+#endif
+#ifdef VAR_MPI
+     write(f_output,'(A,I0,A)') ' MPI version - running on ',&
+          prog_info%nb_cpu,' CPUs'
+#endif
+#ifdef VAR_OMP
+     write(f_output,'(A,I0,A)') ' OMP version - running on ',&
+          prog_info%nb_thread,' threads'
+#endif
+     call date_and_time(date, time, zone, values)
+     write(f_output,*) 'Calculation started on ', date(7:8),'-',date(5:6),&
+          '-',date(1:4), ' at ', time(1:2),':',time(3:4)
+     write(f_output,*)
+
+     write(f_output,'(X,2A)') '>>> Method ',prog_info%method
+
+     write(f_output,*) ">>> Ouverture des fichiers"
+     write(f_output,9001) file_output, prog_info%prefix(1:n)//"."//file_output
+  endif
+
+  if (prog_info%Yprefix) then
+     open (f_bdet,file=prog_info%prefix(1:n)//"."//file_bdet,&
+          form="unformatted")
+     open (f_info,file=prog_info%prefix(1:n)//"."//file_info,&
+          form="unformatted")
+     !open (f_density_mat,file=prog_info%prefix(1:n)//"."//file_rho,&
+     !     form="formatted")
+     open (f_restart,file=prog_info%prefix(1:n)//"."//file_restart,&
+          form="unformatted")
+     open (f_ref0,file=prog_info%prefix(1:n)//"."//file_ref0,&
+          form="formatted")
+
+
+     if (prog_info%id_cpu.eq.0) then
+        write(f_output,9001) file_bdet, prog_info%prefix(1:n)//"."//file_bdet
+        write(f_output,9001) file_info, prog_info%prefix(1:n)//"."//file_info
+        write(f_output,9001) file_restart, prog_info%prefix(1:n)//"."//file_restart
+        !write(f_output,9001) file_rho, prog_info%prefix(1:n)//"."//file_rho
+        write(f_output,9001) file_ref0, prog_info%prefix(1:n)//"."//file_ref0
+     endif
+  else
+     open (f_bdet,file=file_bdet,form="unformatted")
+     open (f_info,file=file_info,form="unformatted")
+     open (f_restart,file=file_restart,form="unformatted")
+     !open (f_density_mat,file=file_rho,form="formatted")
+     open (f_ref0,file=file_ref0,form="formatted")
+     
+     if (prog_info%id_cpu.eq.0) then
+        write(f_output,9001) file_bdet, file_bdet
+        write(f_output,9001) file_info, file_info
+        write(f_output,9001) file_restart, file_restart
+        write(f_output,9001) file_ref0, file_ref0
+        !write(f_output,9001) file_rho, file_rho
+     endif
+  end if
+
+  
+
+!!$==================================================================== 
+9001 format(a5," :",a80)
+End subroutine def_files_prop
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/detact.F90 b/src/detact.F90
new file mode 100644
index 0000000000000000000000000000000000000000..147ed112e2ab2469c8f6d73758ab10c061c56891
--- /dev/null
+++ b/src/detact.F90
@@ -0,0 +1,1516 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module detact
+
+  use info
+  use dimensions 
+  use files
+  use typedet
+  use utils_wrt
+  use utils_bits
+  use vec_storage
+
+  implicit none
+  
+  !$==================================================================
+  !> @brief Storage unit for the different categories of active
+  !! determinants
+  !!
+  !! The active determinants are classified based on several criteria:
+  !! * their number of CAS-CAS excitations
+  !! * their number of electrons in the active space 
+  !!
+  !! For each category R^{NelCAS}_{Nexc}:
+  !! * NelCAS is the the number of additional electrons in the active
+  !! space with respect to ref0
+  !! * NexcCAS is the number of CAS-CAS excitations with respect to ref0
+  !! * NdetCAS is the number of determinants in the category
+  !! * Nb_Rlist is the total number of different categories 
+  !! * elms is the (ordered) array of determinants
+  !! * connect1 is the connectivity at first order 
+  !! * connect2 is the connectivity at second order
+  !!
+  !! There are 9 different categories of active det. lists:
+  !! R_0^0, R_0^1, R_0^2, R_1^0, R_1^1, R_2^0, R_-1^0, R_-1^1, R_-2^0
+  !$==================================================================== 
+  type, public  :: detact_list
+     !> @brief NelCAS Number of additional electrons in the active space
+     integer :: NelCAS
+     !> @brief NexcCAS Number of CAS-CAS excitations
+     integer :: NexcCAS
+     !> @brief NdetCAS number of determinants in the category
+     integer :: NdetCAS
+     !> @brief Nb_rlist
+     integer :: nb_rlist
+     !> @brief Logical set to true when elms is allocated
+     logical :: alloc
+     !> @brief elms Array of active determinants in the category
+     integer(kind=kindact), pointer :: elms(:)
+!!$     !> @brief connect1
+!!$     type(intvecvec), pointer :: connect1(:)
+!!$     !> @brief connect2
+!!$     type(intvecvec), pointer :: connect2(:)
+  end type detact_list
+
+  type, public :: detact_listp
+     type(detact_list), pointer :: p
+  end type detact_listp
+
+  type, public :: rlist
+     !> @brief Storage unit for all R_M^N lists
+     type(detact_listp), dimension(:), allocatable :: l
+     integer :: nb_rlist
+  end type rlist
+  
+  interface get_Rindx
+     module procedure get_Rindx2, get_Rindx1
+  end interface get_Rindx
+
+  interface get_detact
+     module procedure get_detact2, get_detact1
+  end interface get_detact
+
+contains
+
+  !$====================================================================
+  !> @brief Return the indx corresponding to a nb of electrons in the
+  !! CAS and a number of excitations
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] nel Nb of electrons in the CAS
+  !> @param[in] nexc Nb of excitation in the CAS
+  !> @return indx the Storage index in the R list
+  !$====================================================================
+  function get_Rindx2(nel, nexc) result(indx)
+
+    implicit none
+
+    integer, intent(in) :: nel, nexc
+    integer :: indx
+    
+    select case(nel)
+    case (0)
+       select case (nexc)
+       case (0)
+          indx = 1
+       case (1)
+          indx = 2
+       case (2)
+          indx = 3
+       end select
+    case (1)
+       select case (nexc)
+       case (0)
+          indx = 4
+       case (1)
+          indx = 5
+       end select
+    case (2)
+       indx = 6
+    case (-1)
+       select case (nexc)
+       case (0)
+          indx = 7
+       case (1)
+          indx = 8
+       end select
+    case (-2)
+       indx = 9
+    end select
+  end function get_Rindx2
+
+  !$====================================================================
+  !> @brief Return the indx corresponding to a nb of electrons in the
+  !! CAS and a number of excitations '02'
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] name 
+  !> @return indx the Storage index in the R list
+  !$====================================================================
+  function get_Rindx1(name) result(indx)
+
+    implicit none
+
+    integer, intent(in) :: name
+    integer :: indx
+    
+    select case(name)
+    case (00)
+       indx = 1
+    case (01)
+       indx = 2
+    case (02)
+       indx = 3
+    case (10)
+       indx = 4
+    case (11)
+       indx = 5
+    case(20)
+       indx = 6
+    case (-10)
+       indx = 7
+    case (-11)
+       indx = 8
+    case (-20)
+       indx = 9
+    end select
+  end function get_Rindx1
+
+
+  !$====================================================================
+  !> @brief Return the pointer to the detact list corresponding to a nb
+  !! of e- in the CAS and a number of excitations
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] nel Nb of electrons in the CAS
+  !> @param[in] nexc Nb of excitation in the CAS
+  !> @return indx the Storage index in the R list
+  !$====================================================================
+  function get_detact2(r, nelCAS, nexcCAS) result(p)
+
+    implicit none
+
+    type(rlist), intent(in)    :: r
+    integer, intent(in)        :: nelCAS, nexcCAS
+    type(detact_list), pointer :: p
+
+    integer :: indx
+    
+    indx = get_Rindx(nelCAS, nexcCAS)
+    p => r%l(indx)%p
+
+  end function get_detact2
+
+  !$====================================================================
+  !> @brief Return the pointer to the detact list corresponding to a nb
+  !! of e- in the CAS and a number of excitations
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] name -20 for R_{-2}^0
+  !> @return indx the Storage index in the R list
+  !$====================================================================
+  function get_detact1(r, name) result(p)
+
+    implicit none
+
+    type(rlist), intent(in)    :: r
+    integer, intent(in)        :: name
+    type(detact_list), pointer :: p
+
+    integer :: indx
+    
+    indx = get_Rindx(name)
+    p => r%l(indx)%p
+
+  end function get_detact1
+  
+  !$====================================================================
+  !> @brief Initialize all active part of the determinant lists R_M^N
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[inout] rlist
+  !> @param[in] nb_rlist
+  !$====================================================================
+  subroutine detact_all_init(r, nb_rlist)
+    
+    implicit none
+
+    type(rlist), intent(inout) :: r
+    integer, intent(in)        :: nb_rlist
+
+    if (nb_rlist .ne. 9) then
+       write(f_output,*) 'nb_rlist',nb_rlist
+       call SASS_quit('Wrong number of R_M^N lists, should be 9',f_output)
+    endif
+
+    r%nb_rlist = nb_rlist
+    allocate(r%l(r%nb_rlist))
+    
+    call detact_listp_init(r, 0, 0)
+    call detact_listp_init(r, 0, 1)
+    call detact_listp_init(r, 0, 2)
+    call detact_listp_init(r, 1, 0)
+    call detact_listp_init(r, 1, 1)
+    call detact_listp_init(r, 2, 0)
+    call detact_listp_init(r, -1, 0)
+    call detact_listp_init(r, -1, 1)
+    call detact_listp_init(r, -2, 0)
+
+  end subroutine detact_all_init
+
+
+  !$====================================================================
+  !> @brief Free all active part of the determinant lists R_M^N
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] r
+  !$====================================================================
+  subroutine detact_all_free(r)
+
+    implicit none
+
+    type(rlist), intent(inout) :: r
+
+    integer :: i
+    
+    do i = 1, r%nb_rlist
+       call detact_listp_free(r%l(i))
+    enddo
+
+    deallocate(r%l)
+    
+  end subroutine detact_all_free
+
+  
+  !$====================================================================
+  !> @brief Initialize storage for a list of active determinants
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] dcat Object to be initalized R_{NelCAS}^{NexcCAS}
+  !> @param[in] NelCAS Number of additional el in the CAS (-2 to 2)
+  !> @param[in] NexcCAS
+  !$==================================================================== 
+  subroutine detact_listp_init(r, NelCAS, NexcCAS)
+
+    implicit none
+    
+    type(rlist), intent(inout) :: r
+    integer, intent(in)        :: NelCAS, NexcCAS
+    
+    integer :: indx
+    
+    ! Consistency check
+    if ((NelCAS .lt. -2) .or. (NelCAS .gt. 2)) then
+       write(f_output,*) 'Incorrect number of additional active electrons', NelCAS
+       call SASS_quit('nelCAS',f_output)
+    endif
+    if ((NexcCAS .lt. 0) .or. (NexcCAS .gt. 2)) then
+       call SASS_quit('The number of CAS-CAS excitations must be 0, 1 or 2',f_output)
+    endif
+
+    ! Get storage index matching the nb of excitations and electrons 
+    indx = get_Rindx(nelCAS, nexcCAS)
+    nullify(r%l(indx)%p)
+    allocate(r%l(indx)%p)
+
+    ! Initialization
+    call detact_list_init(r%l(indx)%p, NelCAS, NexcCAS, r%nb_rlist)
+    
+  end subroutine detact_listp_init
+
+  !$====================================================================
+  !> @brief Free a type(detact_listp) object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] dcat active determinant list to be freed
+  !$==================================================================== 
+  subroutine detact_listp_free(dcat)
+
+    implicit none
+
+    type(detact_listp), intent(inout) :: dcat
+
+    call detact_list_free(dcat%p)
+    deallocate(dcat%p)
+    
+  end subroutine detact_listp_free
+  
+  !$====================================================================
+  !> @brief Initialize storage for a list of active determinants
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] dcat Object to be initalized R_{NelCAS}^{NexcCAS}
+  !> @param[in] NelCAS Number of additional el in the CAS (-2 to 2)
+  !> @param[in] NexcCAS
+  !$==================================================================== 
+  subroutine detact_list_init(dlist, NelCAS, NexcCAS, Nb_Rlist)
+
+    implicit none
+    
+    type(detact_list), intent(inout) :: dlist
+    integer, intent(in)            :: NelCAS, NexcCAS, Nb_Rlist
+    
+    ! Initialization
+    dlist%NelCAS = NelCAS
+    dlist%NexcCAS = NexcCAS
+    dlist%NdetCAS = 0
+    dlist%Nb_Rlist = Nb_rlist
+    dlist%alloc = .false.
+    nullify(dlist%elms)
+
+  end subroutine detact_list_init
+  
+  
+  !$====================================================================
+  !> @brief Free a type(detact_listp) object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] dlist active determinant list to be freed
+  !$==================================================================== 
+  subroutine detact_list_free(dlist)
+
+    implicit none
+
+    type(detact_list), intent(inout) :: dlist
+    
+    if (dlist%alloc) then
+       deallocate(dlist%elms)
+    endif
+       
+  end subroutine detact_list_free
+
+  
+  !$====================================================================
+  !> @brief Fill an active determinant list from a determinant list
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] detactlist active determinant list to be filled
+  !> @param[in] detlist total determinant list
+  !> @param[in] ndet number of total determinants in detlist
+  !$==================================================================== 
+  subroutine extract_detact_list(detactlist, detlist, ndet)
+
+    implicit none
+
+    type(detact_list), intent(inout)      :: detactlist
+    type(deter), dimension(:), intent(in) :: detlist
+    integer, intent(in)                   :: ndet
+    
+    integer :: idet, j
+    integer(Kind= kindact), dimension(:), allocatable :: tmpdetact
+    integer :: ndetact
+    logical :: lredundant
+
+    !> @todo remove the redundant detact
+
+    if (ndet .eq. 0) then
+       detactlist%NdetCAS = ndet
+       allocate(detactlist%elms(detactlist%NdetCAS))
+       detactlist%alloc = .true.
+    else
+       allocate(tmpdetact(ndet))
+       tmpdetact(:) = 0
+       
+       ndetact = 0
+       do idet = 1, ndet
+          lredundant = .false.
+          do j=1,ndetact
+             if (tmpdetact(j) .eq. detlist(idet)%detact) lredundant = .true. 
+          enddo
+          if (.not. lredundant) then
+             ndetact = ndetact+1
+             tmpdetact(ndetact) = detlist(idet)%detact
+          endif
+       enddo
+       
+       detactlist%NdetCAS = ndetact
+
+       allocate(detactlist%elms(detactlist%NdetCAS))
+       detactlist%alloc = .true.
+    
+       do idet = 1, ndetact
+          detactlist%elms(idet) = tmpdetact(idet)
+       enddo
+       deallocate(tmpdetact)
+    endif
+  end subroutine extract_detact_list
+
+  
+  !$====================================================================
+  !> @brief Fill an active determinant list from an active determinant list
+  !> and remove the redundant ones
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[inout] r active determinant list to be filled
+  !> @param[in] detact_array array of active part of determinants 
+  !> @param[in] ndet number of active determinants
+  !$==================================================================== 
+  subroutine fill_detact_list(r, detact_array, ndet)
+
+    implicit none
+
+    type(detact_list), intent(inout)                 :: r
+    integer(Kind= kindact), dimension(:), intent(in) :: detact_array
+    integer, intent(in) :: ndet
+        
+    integer :: idet, j
+    integer(Kind= kindact), dimension(:), allocatable :: tmpdetact
+    integer :: ndetact
+    logical :: lredundant
+
+    !r%NdetCAS = ndet
+
+    if (r%alloc) then
+       deallocate(r%elms)
+    endif
+       
+    if (ndet.ne.0) then
+       allocate(tmpdetact(ndet))
+       tmpdetact(:) = 0
+       
+       ndetact = 0
+       do idet = 1, ndet
+          lredundant = .false.
+          do j=1,ndetact
+             if (tmpdetact(j) .eq. detact_array(idet)) lredundant = .true. 
+          enddo
+          if (.not. lredundant) then
+             ndetact = ndetact+1
+             tmpdetact(ndetact) = detact_array(idet)
+          endif
+       enddo
+       
+       r%NdetCAS = ndetact
+       
+       allocate(r%elms(r%NdetCAS))
+       r%alloc = .true.
+       
+       do idet = 1, ndetact
+          r%elms(idet) = tmpdetact(idet)
+       enddo
+       deallocate(tmpdetact)
+    else
+       allocate(r%elms(1))
+       r%alloc = .true.
+       r%elms(1) = 0
+    endif
+
+    
+  end subroutine fill_detact_list
+
+  !$====================================================================
+  !> @brief Remove the act. det. from dact2 contained in dact1
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[inout] dact1 detact_list   
+  !> @param[in] dact2 detact_list 
+  !$====================================================================
+  subroutine sub_detact_list(dact1, dact2)
+
+    implicit none
+
+    type(detact_list), intent(inout) :: dact1
+    type(detact_list), intent(in)    :: dact2
+
+    integer(kind=kindact), dimension(:), allocatable :: tmpelms
+    integer :: i,j,ndet
+    logical :: lredundant
+
+    ndet = 0
+    allocate(tmpelms(dact1%NdetCAS))
+    tmpelms(:) = 0
+    do i=1,dact1%NdetCAS
+       lredundant = .false.
+       !write(*,*) dact1%elms(i)
+       do j=1,dact2%NdetCAS
+          !write(*,*) dact2%elms(j)
+          if (dact1%elms(i) .eq. dact2%elms(j)) then
+             lredundant = .true.
+          endif
+       enddo
+       if (.not.lredundant) then
+          ndet = ndet + 1
+          tmpelms(ndet) = dact1%elms(i)
+       endif
+    enddo
+
+    dact1%NdetCAS = ndet
+    deallocate(dact1%elms)
+    allocate(dact1%elms(ndet))
+    dact1%elms(:) = tmpelms(1:ndet)
+    deallocate(tmpelms)
+    
+  end subroutine sub_detact_list
+  
+  !$===================================================================
+  !> @brief Printing subroutine for detact_list
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$
+  !> @param[in] d detact_list to be printed
+  !> @param[in] iout Logical unit for standard output
+  !> @param[in] nact Number of active orbitals
+  !$==================================================================
+  subroutine wrt_detact_list(d, iout, nact)
+
+    implicit none
+    
+    type(detact_list), intent(in) :: d
+    integer,intent(in)            :: iout, nact
+
+    integer :: i
+
+    write(iout,'(A)') '==='
+    write(iout,'(A,I0,A,I0)') 'Active determinant list R_', &
+         d%nelCAS,'^',d%nexcCAS
+
+    if (debug) then
+       if (d%alloc) then
+          write(iout,'(A,I0,A)') 'Contains ',d%ndetCAS,' determinants'
+          do i = 1, d%NdetCAS
+             call wrtact(d%elms(i), iout, .false., nact)
+          enddo
+       endif
+    endif
+    
+  end subroutine wrt_detact_list
+
+
+  !$===================================================================
+  !> @brief Counts the number of differences between two detacts
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] deta first detact
+  !> @param[in] detb second detact
+  !> @return ndiff integer Nb of differences
+  !$===================================================================
+  function count_diff(deta, detb, nact) result(ndiff)
+
+    implicit none
+
+    integer(kind=kindact), intent(in) :: deta, detb
+    integer, intent(in) :: nact
+    
+    integer :: ndiff
+    integer(kind=kindact) :: tmp
+
+    ndiff = 0
+    tmp = (ieor(deta,detb))
+    !call wrtact(deta, f_output, .false., nact)
+    !call wrtact(detb, f_output, .false., nact)
+    !call wrtact(tmp, f_output, .false., nact)
+    ndiff = sumbits(tmp,0,2*nact-1)
+    
+  end function count_diff
+
+  !$===================================================================
+  !> @brief Compute the sign of the permutation between 2 active
+  !! determinants deta and detb, returns the differences in each
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !
+  !> @param[in] deta first detact
+  !> @param[in] detb second detact
+  !> @param[out] diffa
+  !> @param[out] diffb
+  !> @param[out] sign_ab
+  !$===================================================================
+  subroutine sign_diff(deta, detb, diffa, diffb, and_ab, sign_ab, nact)
+
+    integer(kind=kindact), intent(in)  :: deta, detb
+    integer(kind=kindact), intent(out) :: diffa, diffb, and_ab
+    integer(kind=kd_int), intent(in)   :: nact
+    integer(kind=kd_int), intent(out)  :: sign_ab
+    
+    integer :: nactand, nperm, ibit
+    
+    and_ab = iand(deta,detb)
+    diffa = iand(deta,not(and_ab))
+    diffb = iand(detb,not(and_ab))
+
+    nactand = 0
+    nperm = 0
+    do ibit=0, 2*nact-1
+       if (btest(and_ab, ibit)) nactand = nactand +1
+       if (btest(diffa, ibit)) then
+          nperm = nperm + nactand
+       endif
+       if (btest(diffb, ibit)) then
+          nperm = nperm + nactand
+       endif
+    enddo
+
+        
+    if (btest(nperm,0)) then
+       sign_ab = -1  
+    else
+       sign_ab = 1
+    endif
+  end subroutine sign_diff
+
+ 
+  !$============================================================
+  !> @brief Generate all active determinants for the screening
+  !> @author E. Rebolini
+  !> @date Apr 2018
+  !
+  !$============================================================
+  subroutine compute_all_detact(r, o_info)
+    
+    type(rlist), intent(inout)         :: r
+    type(o_infotype), intent(in)       :: o_info
+
+    call compute_detact_CASCAS(r,0,o_info)  !R01
+    call compute_R02(r, o_info)             !R02
+    call compute_detact_CASCAS(r,1,o_info)  !Rp11
+    call compute_detact_CASCAS(r,-1,o_info) !Rm11
+    call compute_Rp20(r, o_info)            !Rp20
+    call compute_Rm20(r, o_info)            !Rm20
+    
+  end subroutine compute_all_detact
+
+
+  !$============================================================
+  !> @brief Generate all R02 active determinants 
+  !> @author E. Rebolini
+  !> @date Apr 2018
+  !
+  !$============================================================
+  subroutine compute_R02(r, o_info)
+
+    type(rlist), intent(inout)         :: r
+    type(o_infotype), intent(in)       :: o_info
+
+    type(detact_list), pointer :: r00, r01, r02
+    integer(kindact), dimension(:), pointer :: newref0, NewRef1
+    integer :: nref0, NRef1cascas
+
+    integer :: n, isft, torb, nact, porb, idet, ngen, i
+    Integer (Kind= kindact), dimension(:), allocatable :: NewM
+    Integer (Kind= kindact) :: tmpact
+    Logical, parameter :: debugl=.false.
+    
+    nact= o_info%nact
+    ngen=0
+
+    ! Ref0
+    r00 => get_detact(r,0,0)
+    nref0 = r00%ndetCAS
+    newref0 => r00%elms(:)
+    
+    ! Ref1CASCAS
+    r01 => get_detact(r,0,1)
+    nref1cascas = r01%ndetCAS
+    newref1 => r01%elms(:)
+
+    ! Estimation of nb of det for allocation
+    n = 0
+    isft = 0
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          if (torb.eq.porb) cycle
+          do idet = 1+isft , NRef1cascas+isft
+             if (btest(NewRef1(idet), torb) .and. &
+                  .not.btest(NewRef1(idet), porb)) n = n + 1
+             if (btest(NewRef1(idet), torb+nact) .and. &
+                  .not.btest(NewRef1(idet), porb+nact)) n = n+1
+             if (btest(NewRef1(idet), torb) .and. &
+                  .not.btest(NewRef1(idet), porb+nact)) n = n + 1
+             if (btest(NewRef1(idet), torb+nact) .and. &
+                  .not.btest(NewRef1(idet), porb)) n = n+1
+          end do
+       end do
+    end do
+
+    ! Genere CAS  -> CAS sur Ref1cascas
+    if (n.eq.0) then
+       ! Save the active parts in R_0^2
+       r02 => get_detact(r,0,2)
+       call fill_detact_list(r02, NewM, 0)
+    else
+
+       allocate(NewM(n))
+       NewM(:) = 0
+       do torb = 0, nact-1
+          do porb = 0,nact-1
+             if (torb.eq.porb) cycle
+             ! excitations de spin up
+             do idet = 1, nRef1CasCas
+                if (btest(NewRef1(idet), torb) .and. &
+                     .not.btest(NewRef1(idet), porb)) then 
+                   tmpact = ibclr(NewRef1(idet), torb)
+                   tmpact = ibset(tmpact,porb)
+                   do i = 1,nRef0
+                      if (tmpact.eq.NewRef0(i)) goto 11
+                   end do
+                   do i = 1,nRef1cascas
+                      if (tmpact.eq.NewRef1(i)) goto 11
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 11
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                   if (debugl) then 
+                      call wrtact(tmpact, f_output, .true., nact)
+                      write(f_output,*) 
+                   end if
+                end if
+11              continue
+             end do
+             ! excitations de spin down
+             do idet = 1, nRef1CasCas
+                if (btest(NewRef1(idet), torb+nact) .and. &
+                     .not.btest(NewRef1(idet), porb+nact)) then 
+                   tmpact = ibclr(NewRef1(idet), torb+nact)
+                   tmpact = ibset(tmpact,porb+nact)
+                   do i = 1,nRef0
+                      if (tmpact.eq.NewRef0(i)) goto 12
+                   end do
+                   do i = 1,nRef1cascas
+                      if (tmpact.eq.NewRef1(i)) goto 12
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 12
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+12              continue
+             end do
+          enddo
+       enddo
+       do torb = 0, nact-1
+          do porb = 0,nact-1
+             !excitation up-down
+              do idet = 1, nRef1CasCas
+                if (btest(NewRef1(idet), torb) .and. &
+                     .not.btest(NewRef1(idet), porb+nact)) then 
+                   tmpact = ibclr(NewRef1(idet), torb)
+                   tmpact = ibset(tmpact,porb+nact)
+                   do i = 1,nRef0
+                      if (tmpact.eq.NewRef0(i)) goto 13
+                   end do
+                   do i = 1,nRef1cascas
+                      if (tmpact.eq.NewRef1(i)) goto 13
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 13
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+13              continue
+             end do
+             !excitation down-up
+              do idet = 1, nRef1CasCas
+                if (btest(NewRef1(idet), torb+nact) .and. &
+                     .not.btest(NewRef1(idet), porb)) then 
+                   tmpact = ibclr(NewRef1(idet), torb+nact)
+                   tmpact = ibset(tmpact,porb)
+                   do i = 1,nRef0
+                      if (tmpact.eq.NewRef0(i)) goto 14
+                   end do
+                   do i = 1,nRef1cascas
+                      if (tmpact.eq.NewRef1(i)) goto 14
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 14
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+14              continue
+             end do
+          end do
+       end do
+
+       ! Save the active parts in R_0^2
+       r02 => get_detact(r,0,2)
+       call fill_detact_list(r02, NewM, ngen)
+       deallocate(NewM)
+    endif
+    
+  end subroutine compute_R02
+
+  
+  !$============================================================
+  !> @brief Generate all active determinants for R-1^1 or R_1^1
+  !! by doing a CAS-CAS excitation from R-1^0 or R_1^0 respectively
+  !> @author E. Rebolini
+  !> @date Apr 2018
+  !
+  !> @param[inout] r
+  !> @param[in] nel
+  !> @param[in] o_info
+  !$============================================================
+  subroutine compute_detact_CASCAS(r,nel,o_info)
+
+    type(rlist), intent(inout)         :: r
+    type(o_infotype), intent(in)       :: o_info
+    integer, intent(in)                :: nel
+
+    type(detact_list), pointer :: rm10, rm11
+    integer :: nref
+    integer(kindact), dimension(:), pointer :: ref
+
+    integer :: n, torb, porb, idet, nact, ngen, i
+    Integer (Kind= kindact), dimension(:), allocatable :: NewM
+    Integer (Kind= kindact) :: tmpact
+    Logical, parameter :: debugl=.false.
+
+
+    nact= o_info%nact
+    ngen=0
+    
+    ! R_{-1}^0 ou R_{1}^0
+    rm10 => get_detact(r,nel,0)
+    nref = rm10%ndetCAS
+    ref => rm10%elms(:)
+
+    
+    ! CAS -> CAS sur Ref
+    
+    ! Estimation of nb of det for allocation
+    n = 0
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          if (torb.eq.porb) cycle
+          do idet = 1, nref
+             if (btest(Ref(idet), torb) .and. &
+                  .not.btest(Ref(idet), porb)) n = n + 1
+             if (btest(Ref(idet), torb+nact) .and. &
+                  .not.btest(Ref(idet), porb+nact)) n = n+1
+          end do
+       end do
+    end do
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          do idet = 1, nref
+             if (btest(Ref(idet), torb+nact) .and. &
+                  .not.btest(Ref(idet), porb)) n = n + 1
+             if (btest(Ref(idet), torb) .and. &
+                  .not.btest(Ref(idet), porb+nact)) n = n+1
+          end do
+       end do
+    end do
+
+    ! Genere CAS  -> CAS 
+    if (n.eq.0) then
+       ! Save the active parts
+       allocate(NewM(1))
+       rm11 => get_detact(r,nel,1)
+       call fill_detact_list(rm11, NewM, 0)
+       deallocate(NewM)
+    else
+       allocate(NewM(n))
+       NewM(:) = 0
+       do torb = 0, nact-1
+          do porb = 0,nact-1
+             if (torb.eq.porb) cycle
+             ! excitations de spin up
+             do idet = 1, nRef
+                if (btest(Ref(idet), torb) .and. &
+                     .not.btest(Ref(idet), porb)) then 
+                   tmpact = ibclr(Ref(idet), torb)
+                   tmpact = ibset(tmpact,porb)
+                   do i = 1,nRef
+                      if (tmpact.eq.Ref(i)) goto 21
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 21
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                   if (debugl) then 
+                      call wrtact(tmpact, f_output, .true., nact)
+                      write(f_output,*) 
+                   end if
+                end if
+21              continue
+             end do
+             ! excitations de spin down
+             do idet = 1, nRef
+                if (btest(Ref(idet), torb+nact) .and. &
+                     .not.btest(Ref(idet), porb+nact)) then 
+                   tmpact = ibclr(Ref(idet), torb+nact)
+                   tmpact = ibset(tmpact,porb+nact)
+                   do i = 1,nRef
+                      if (tmpact.eq.Ref(i)) goto 22
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 22
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+22              continue
+             end do
+          end do
+       end do
+
+       ! In order to have distinct spin categories - separate loop
+       do torb = 0, nact-1
+          do porb = 0,nact-1
+             !if (torb.eq.porb) cycle
+             !excitation up-down
+              do idet = 1, nRef
+                if (btest(Ref(idet), torb) .and. &
+                     .not.btest(Ref(idet), porb+nact)) then 
+                   tmpact = ibclr(Ref(idet), torb)
+                   tmpact = ibset(tmpact,porb+nact)
+                   do i = 1,nRef
+                      if (tmpact.eq.Ref(i)) goto 23
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 23
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+23              continue
+             end do
+          end do
+       end do
+       do torb = 0, nact-1
+          do porb = 0,nact-1
+             !excitation down-up
+              do idet = 1, nRef
+                if (btest(Ref(idet), torb+nact) .and. &
+                     .not.btest(Ref(idet), porb)) then 
+                   tmpact = ibclr(Ref(idet), torb+nact)
+                   tmpact = ibset(tmpact,porb)
+                   do i = 1,nRef
+                      if (tmpact.eq.Ref(i)) goto 24
+                   end do
+                   do i = 1,ngen
+                      if (tmpact.eq.NewM(i)) goto 24
+                   end do
+                   ngen = ngen + 1
+                   NewM(ngen) = tmpact
+                end if
+24              continue
+             end do
+          end do
+       end do
+
+       ! Save the active parts 
+       rm11 => get_detact(r,nel,1)
+       call fill_detact_list(rm11, NewM, ngen)
+       deallocate(NewM)
+    endif
+    
+  end subroutine compute_detact_CASCAS
+
+
+  !$============================================================
+  !> @brief Generate R_2^0 by adding an electron in R_1^0
+  !> @author E. Rebolini
+  !> @date Apr 2018
+  !
+  !> @param[inout] r
+  !> @param[in] o_info
+  !$============================================================
+  subroutine compute_Rp20(r, o_info)
+
+    type(rlist), intent(inout)         :: r
+    type(o_infotype), intent(in)       :: o_info
+
+    type(detact_list), pointer :: rp10, rp20
+    integer :: nref
+    integer(kindact), dimension(:), pointer :: ref
+
+    integer :: n, porb, idet, nact, ngen, i
+    Integer (Kind= kindact), dimension(:), allocatable :: NewM
+    Integer (Kind= kindact) :: tmpact
+    Logical, parameter :: debugl=.false.
+
+    nact= o_info%nact
+    ngen=0
+
+    ! R_{1}^0
+    rp10 => get_detact(r,1,0)
+    nref = rp10%ndetCAS
+    ref => rp10%elms(:)
+
+    ! Estimation of nb of det for allocation
+    n = 0
+    do porb = 0,nact-1
+       do idet = 1, nref
+          if (.not.btest(Ref(idet), porb)) n = n + 1
+          if (.not.btest(Ref(idet), porb+nact)) n = n+1
+       end do
+    end do
+
+    if (n.eq.0) then
+       ! Save the active parts 
+       rp20 => get_detact(r,2,0)
+       call fill_detact_list(rp20, NewM, 0)
+    else
+       allocate(NewM(n))
+       NewM(:) = 0
+       do porb = 0,nact-1
+          ! excitations de spin up
+          do idet = 1, nRef
+             if (.not.btest(Ref(idet), porb)) then 
+                tmpact = ibset(Ref(idet),porb)
+                do i = 1,ngen
+                   if (tmpact.eq.NewM(i)) goto 31
+                end do
+                ngen = ngen + 1
+                NewM(ngen) = tmpact
+                if (debugl) then 
+                   call wrtact(tmpact, f_output, .true., nact)
+                   write(f_output,*) 
+                end if
+             end if
+31           continue
+          end do
+          ! excitations de spin down
+          do idet = 1, nRef
+             if (.not.btest(Ref(idet), porb+nact)) then 
+                tmpact = ibset(ref(idet),porb+nact)
+                do i = 1,ngen
+                   if (tmpact.eq.NewM(i)) goto 32
+                end do
+                ngen = ngen + 1
+                NewM(ngen) = tmpact
+             end if
+32           continue
+          end do
+       end do
+
+       ! Save the active parts 
+       rp20 => get_detact(r,2,0)
+       call fill_detact_list(rp20, NewM, ngen)
+       deallocate(NewM)
+    endif
+
+  end subroutine compute_Rp20
+
+  !$============================================================
+  !> @brief Generate R_-2^0 by removing an electron from R_-1^0
+  !> @author E. Rebolini
+  !> @date Apr 2018
+  !
+  !> @param[inout] r
+  !> @param[in] o_info
+  !$============================================================
+  subroutine compute_Rm20(r, o_info)
+
+    type(rlist), intent(inout)         :: r
+    type(o_infotype), intent(in)       :: o_info
+
+    type(detact_list), pointer :: rm10, rm20
+    integer :: nref
+    integer(kindact), dimension(:), pointer :: ref
+
+    integer :: n, torb, idet, nact, ngen, i
+    Integer (Kind= kindact), dimension(:), allocatable :: NewM
+    Integer (Kind= kindact) :: tmpact
+    Logical, parameter :: debugl=.false.
+
+    nact= o_info%nact
+    ngen=0
+
+    ! R_{-1}^0
+    rm10 => get_detact(r,-1,0)
+    nref = rm10%ndetCAS
+    ref => rm10%elms(:)
+
+    ! Estimation of nb of det for allocation
+    n = 0
+    do torb = 0,nact-1
+       do idet = 1, nref
+          if (btest(Ref(idet), torb)) n = n + 1
+          if (btest(Ref(idet), torb+nact)) n = n+1
+       end do
+    end do
+
+    if (n.eq.0) then
+       ! Save the active parts 
+       rm20 => get_detact(r,-2,0)
+       call fill_detact_list(rm20, NewM, 0)
+    else
+       allocate(NewM(n))
+       NewM(:) = 0
+       do torb = 0,nact-1
+          ! excitations de spin up
+          do idet = 1, nRef
+             if (btest(Ref(idet), torb)) then 
+                tmpact = ibclr(Ref(idet),torb)
+                do i = 1,ngen
+                   if (tmpact.eq.NewM(i)) goto 41
+                end do
+                ngen = ngen + 1
+                NewM(ngen) = tmpact
+                if (debugl) then 
+                   call wrtact(tmpact, f_output, .true., nact)
+                   write(f_output,*) 
+                end if
+             end if
+41           continue
+          end do
+          ! excitations de spin down
+          do idet = 1, nRef
+             if (btest(Ref(idet), torb+nact)) then 
+                tmpact = ibclr(ref(idet),torb+nact)
+                do i = 1,ngen
+                   if (tmpact.eq.NewM(i)) goto 42
+                end do
+                ngen = ngen + 1
+                NewM(ngen) = tmpact
+             end if
+42           continue
+          end do
+       end do
+
+       ! Save the active parts 
+       rm20 => get_detact(r,-2,0)
+       call fill_detact_list(rm20, NewM, ngen)
+       deallocate(NewM)
+    endif
+
+  end subroutine compute_Rm20
+
+
+
+  !$===================================================================
+  !> @brief List the spatial orbitals and their spins in a given active
+  !! determinant
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[in] d active determinant
+  !> @param[in] nact Nb of active orbitals
+  !> @param[in] no Nb of occupied (and frozen) orbitals
+  !> @param[out] a List of spatial orbitals numbers
+  !> @param[out] s List of spins
+  !$==================================================================
+  subroutine extract_orbindx_from_detact(d, a, s, no, nact, ndiff)
+  !subroutine extract_orbindx_from_detact(d, a, s, no, nact, nelact, ndiff)
+    integer(kindact), intent(in) :: d
+    integer, intent(in)  :: nact, no
+    integer, dimension(:) :: a
+    integer, dimension(:) :: s
+    integer, intent(out), optional :: ndiff
+  
+    integer :: ibit, i
+    
+    a(:) = 0
+    s(:) = 0
+    i = 1
+    
+    do ibit=0,nact-1
+       if (btest(d,ibit)) then
+          a(i)=no+ibit+1
+          s(i) = 1
+          !write (*,'(I0,A,X)', advance="no") a(i), 'u'
+          i = i+1
+       endif
+    enddo
+    do ibit=nact,2*nact-1
+       if (btest(d,ibit)) then
+          a(i)=no+ibit+1-nact
+          s(i) = -1
+          !write (*,'(I0,A,X)', advance="no") a(i), 'd'
+          i = i+1
+       endif
+    enddo
+
+    if (present(ndiff)) ndiff = i-1
+    !write(*,*)
+
+  end subroutine extract_orbindx_from_detact
+
+  !$===================================================================
+  !> @brief Return the spin of a detact
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param[in] d detact
+  !> @param[in] nact Number of active orbitals
+  !> @return spin_detact Spin of the active determinant
+  !$===================================================================
+  integer function spin_detact(d,nact)
+
+    integer(kindact), intent(in) :: d
+    integer, intent(in)  :: nact
+
+    spin_detact = sumbits(d,0,nact-1) - sumbits(d,nact, 2*nact-1)
+
+  end function spin_detact
+
+
+  !$===================================================================
+  !> @brief Return the spin difference between a detact and sz
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param[in] d detact
+  !> @param[in] nact Number of active orbitals
+  !> @param[in] sz Spin of the ref0 configurations
+  !> @return spindiff_detact Spin difference between the detact and sz
+  !$===================================================================
+  integer function spindiff_detact(d,nact,sz)
+
+    integer(kindact), intent(in) :: d
+    integer, intent(in)  :: nact, sz
+
+    spindiff_detact = sumbits(d,0,nact-1) - sumbits(d,nact, 2*nact-1) - sz
+
+  end function spindiff_detact
+
+
+!!$  !$====================================================================
+!!$  !> @brief Compute the connectivity for all R list pairs R_M^N
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Oct 2017
+!!$  !$
+!!$  !> @param[inout] r
+!!$  !$====================================================================
+!!$  subroutine detact_all_connect(r, o_info)
+!!$
+!!$    type(o_infotype), intent(in) :: o_info
+!!$    type(rlist), intent(inout)   :: r
+!!$
+!!$    integer :: i,j, idet
+!!$    type(detact_list), pointer :: ri, rj
+!!$
+!!$    do i = 1, r%nb_rlist
+!!$       do j = 1, r%nb_rlist
+!!$          ri => r%l(i)%p
+!!$          rj => r%l(j)%p
+!!$    
+!!$          call compute_connectivity(ri, rj, j, o_info)
+!!$    
+!!$       enddo
+!!$    enddo
+!!$    
+!!$  end subroutine detact_all_connect
+
+!!$  !$===================================================================
+!!$  !> @brief Compute the connectivity at 1st and second order between
+!!$  !! two lists of active determinants
+!!$  !! Stores the positions of the active determinants detb of dlb which 
+!!$  !! connect with a given determinant deta of dla
+!!$  !! with Ndiff the number of different creation operators in the det
+!!$  !! and deltaNel the difference in number of active electrons,
+!!$  !! connect1 connects determinants where ndiff + deltaNel = 2
+!!$  !! connect2 connects determinants where ndiff + deltaNel = 4
+!!$  !! N.B. use the subroutine CM1() and CM2() to access these matrices
+!!$  !
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Oct 2017
+!!$  !$
+!!$  !> @param[inout] dla first detact_list
+!!$  !> @param[inout] dlb second detact_list
+!!$  !> @param[in] idlb position of the detact_list dlb in the global list
+!!$  !$===================================================================
+!!$  subroutine compute_connectivity(dla, dlb, idlb, o_info)
+!!$
+!!$    implicit none
+!!$
+!!$    type(detact_list), intent(inout) :: dla, dlb
+!!$    integer, intent(in)              :: idlb
+!!$    type(o_infotype), intent(in)     :: o_info
+!!$
+!!$    integer :: ideta, idetb
+!!$    integer :: deltaNel
+!!$    integer(kindact), pointer :: tmp1(:), tmp2(:)
+!!$    integer :: iter1, iter2, ndiff, i
+!!$    integer :: nact
+!!$
+!!$    nact = o_info%nact
+!!$
+!!$    !Case ndetCAS = 0 >> dealt with in CM1 and CM2 functions 
+!!$    
+!!$    if (.not.((dla%ndetCAS .eq. 0) .or. (dlb%ndetCAS .eq. 0))) then
+!!$       deltaNel = abs(dla%NelCAS - dlb%NelCAS)
+!!$       if (deltaNel .gt. 2) then
+!!$          !No connectivity matrices are computed
+!!$          call vec_init(dla%connect1(idlb), 0)
+!!$          call vec_init(dla%connect2(idlb), 0)
+!!$       else       
+!!$          !Connectivity at 1st and 2nd order are computed
+!!$          !initialise the dla%connect1 and dla%connect2 at the position  
+!!$          !corresponding to dlb
+!!$          !they will contain dla%ndetCAS vectors (i.e. one vector for each
+!!$          !active det in dla) with the list of connecting vector in dlb 
+!!$          call vec_init(dla%connect1(idlb), dla%ndetCAS)
+!!$          call vec_init(dla%connect2(idlb), dla%ndetCAS)
+!!$
+!!$          allocate(tmp1(dlb%ndetcas))
+!!$          allocate(tmp2(dlb%ndetcas))
+!!$          do ideta = 1, dla%ndetcas
+!!$             tmp1(:) = 0
+!!$             tmp2(:) = 0
+!!$             iter1 = 0
+!!$             iter2 = 0
+!!$             
+!!$             do idetb = 1, dlb%ndetcas
+!!$                ndiff = count_diff(dla%elms(ideta),dlb%elms(idetb), o_info%nact)
+!!$                !write(f_output,*) ndiff, deltaNel, ndiff + deltaNel
+!!$                if ((ndiff + deltaNel) .eq. 2) then
+!!$                   iter1 = iter1 + 1
+!!$                   tmp1(iter1) = idetb
+!!$                   !write(f_output,*) 'Add to CM1'
+!!$                   !call wrtact(dlb%elms(idetb), f_output, .false., nact)
+!!$                else if ((ndiff + deltaNel) .eq. 4) then
+!!$                   iter2 = iter2 + 1
+!!$                   tmp2(iter2) = idetb
+!!$                   !write(f_output,*) 'Add to CM2'
+!!$                   !call wrtact(idetb, f_output, .false., nact)
+!!$                   !call wrtact(tmp2(iter2), f_output, .false., nact)
+!!$                endif
+!!$             enddo
+!!$             call vec_init(dla%connect1(idlb), ideta, iter1)
+!!$             if (iter1 .ne. 0) then
+!!$                dla%connect1(idlb)%vl(ideta)%p%elms = tmp1(1:iter1)
+!!$             endif
+!!$             
+!!$             call vec_init(dla%connect2(idlb), ideta, iter2)
+!!$             if (iter2 .ne. 0) then
+!!$                dla%connect2(idlb)%vl(ideta)%p%elms = tmp2(1:iter2)
+!!$             endif
+!!$          enddo
+!!$          deallocate(tmp1)
+!!$          deallocate(tmp2)
+!!$       endif
+!!$    endif
+!!$
+!!$  end subroutine compute_connectivity
+
+
+!!$  !===================================================================
+!!$  !> @brief Write the connectivity matrix Ri%CM1(idet,Rj)
+!!$  !! returns the number of connected active determinants and their
+!!$  !! positions in Rj%elms(:)
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Apr 2018
+!!$  !
+!!$  !> @param[in] ri
+!!$  !> @param[in] rj
+!!$  !> @param[in] idet
+!!$  !> @param[in] o_info
+!!$  !> @param[out] nCM1
+!!$  !> @param[out] detCM1
+!!$  !===================================================================
+!!$  subroutine CM1_detact_list(ri, rj, idet, nact, nCM1, detCM1)
+!!$    type(detact_list), intent(in) :: ri, rj
+!!$    integer, intent(in)           :: idet
+!!$    integer, intent(in)           :: nact
+!!$    integer :: nCM1
+!!$    integer, pointer :: detCM1(:)
+!!$
+!!$    integer :: indx_rj, i, deltaNel
+!!$    logical :: debug = .false.
+!!$    
+!!$    deltaNel = abs(ri%NelCAS - rj%NelCAS)
+!!$    indx_rj = get_Rindx(rj%nelCAS, rj%nexcCAS)
+!!$    if ((rj%ndetCAS .eq. 0) .or. (deltaNel .gt. 2)) then
+!!$       nCM1 = 0
+!!$    else
+!!$       nCM1 = ri%connect1(indx_rj)%vl(idet)%p%nrow
+!!$    endif
+!!$
+!!$    if (debug) then
+!!$       write(f_output,'(A,I0,I0,A)',advance="no") 'R',ri%nelCAS, ri%nexcCAS,'%CM1('
+!!$       call wrtact(ri%elms(idet), f_output, .true., nact)
+!!$       write(f_output,'(A,I0,I0,A)',advance="no") ', R',rj%nelCAS, rj%nexcCAS,') '
+!!$       write(f_output,'(A,X,I0,X,A)') 'contains', nCM1, 'active determinants'
+!!$    endif
+!!$       
+!!$    if (nCM1 .ne. 0) then
+!!$       detCM1 => ri%connect1(indx_rj)%vl(idet)%p%elms(:)
+!!$       if (debug) then
+!!$          do i = 1, nCM1
+!!$             call wrtact(rj%elms(detCM1(i)), f_output, .true., nact)
+!!$             write(f_output,'(4X)',advance="no")  
+!!$          enddo
+!!$          write(f_output,*)
+!!$       endif
+!!$    endif
+!!$  end subroutine CM1_detact_list
+!!$  
+!!$  !===================================================================
+!!$  !> @brief Write the connectivity matrix Ri%CM2(idet,Rj)
+!!$  !! returns the number of connected active determinants and their
+!!$  !! positions in Rj%elms(:)
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Apr 2018
+!!$  !
+!!$  !> @param[in] ri
+!!$  !> @param[in] rj
+!!$  !> @param[in] idet
+!!$  !> @param[in] o_info
+!!$  !> @param[out] nCM2
+!!$  !> @param[out] detCM2
+!!$  !===================================================================
+!!$  subroutine CM2_detact_list(ri, rj, idet, nact, nCM2, detCM2)
+!!$    type(detact_list), intent(in) :: ri, rj
+!!$    integer, intent(in)           :: idet
+!!$    integer, intent(in)           :: nact
+!!$    integer :: nCM2
+!!$    integer, pointer :: detCM2(:)
+!!$
+!!$    integer :: indx_rj,i, deltaNel
+!!$    logical :: debug = .false.
+!!$    
+!!$    deltaNel = abs(ri%NelCAS - rj%NelCAS)
+!!$
+!!$    indx_rj = get_Rindx(rj%nelCAS, rj%nexcCAS)
+!!$    if ((rj%ndetCAS .eq. 0) .or. (deltaNel .gt. 2))then
+!!$       nCM2 = 0
+!!$    else
+!!$       nCM2 = ri%connect2(indx_rj)%vl(idet)%p%nrow
+!!$    endif
+!!$
+!!$    if (debug) then
+!!$       write(f_output,'(A,I0,I0,A)',advance="no") 'R',ri%nelCAS, ri%nexcCAS,'%CM2('
+!!$       call wrtact(ri%elms(idet), f_output, .true., nact)
+!!$       write(f_output,'(A,I0,I0,A)',advance="no") ', R',rj%nelCAS, rj%nexcCAS,') '
+!!$       write(f_output,'(A,X,I0,X,A)') 'contains', nCM2, 'active determinants'
+!!$    endif
+!!$       
+!!$    if (nCM2 .ne. 0) then
+!!$       detCM2 => ri%connect2(indx_rj)%vl(idet)%p%elms(:)
+!!$       if (debug) then
+!!$          do i = 1, nCM2
+!!$             call wrtact(rj%elms(detCM2(i)), f_output, .true., nact)
+!!$             write(f_output,'(4X)',advance="no") 
+!!$          enddo
+!!$          write(f_output,*)
+!!$       endif
+!!$    endif
+!!$    
+!!$  end subroutine CM2_detact_list
+
+
+end module detact
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
+
+
diff --git a/src/diag.F90 b/src/diag.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9a20c4ecf929635de419a8bf0e771412721aaab2
--- /dev/null
+++ b/src/diag.F90
@@ -0,0 +1,151 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!$====================================================================
+!> @brief full diagonalisation routine
+!!   can use Lapack dsyevd  or given or jacscf 
+!
+!> @param[in] H(ndet,ndet) = matrix to diagonalize
+!> @param[out] E(ndet) = eigenvalues
+!> @param[out] V(ndet,ndet) = eigenvectors 
+!> @param[in] ndet = matrix dimension
+!> @param[in] idiag = diagonalisation method
+!!   idiag = 1 : Lapack dsyevd
+!!   idiag = 2 : given
+!!   idiag = 3 : jacscf
+!!   idiag =-1 : zheev 
+!> @param[in] iout : output file
+!> @param[out] info : diagonalisation error code
+!$====================================================================
+
+subroutine diag(H,E,V,ndet,idiag,iout,info)
+
+  use dimensions
+  
+    implicit none
+    
+    
+    Integer, intent(in)                              :: ndet, idiag, iout 
+    Integer, intent(out)                             :: info
+    real(kd_dble), dimension(ndet,ndet), intent(in)  :: H
+    real(kd_dble), dimension(ndet,ndet), intent(out) :: V
+    real(kd_dble), dimension(ndet), intent(out)      :: E ! , vtmp
+
+    !Integer, parameter :: pas=10
+    !real(kd_dble), dimension(:), allocatable :: hgiven
+    complex*16, dimension(:,:), allocatable :: hcgiven
+    complex*16, dimension(:), allocatable :: work
+    real(kd_dble), dimension(:), allocatable :: rwork
+    !real(kd_dble) :: tmp
+    Integer :: i,j,k,n
+
+    integer :: liwork, lwork
+    integer, dimension(:), allocatable :: iwork
+
+    
+    if (idiag.eq.3) then
+       call jacobi_jacscf(e,V,H,ndet,ndet,.true.)
+!!$    else if (idiag.eq.2) then  !!! given
+!!$       allocate (hgiven((ndet*(ndet+1))/2))
+!!$       hgiven(:) = 0.d0
+!!$       e(:)      = 0.d0
+!!$       V(1:ndet,1:ndet)    = 0.d0
+!!$       k = 0
+!!$       do i=1,ndet
+!!$          do j=i,ndet
+!!$             k=k+1
+!!$             hgiven(k) = h(i,j)
+!!$          end do
+!!$       end do
+!!$       call given(hgiven,E,V,ndet,ndet,ndet)
+!!$       deallocate(hgiven)
+
+    else if ((idiag.eq.1).or.(idiag.eq.2)) then !!! dsyevd
+       V(:,:) = 0.d0
+       e(:) = 0.d0
+       do j = 1,ndet
+          do i = 1,ndet
+             V(i,j)    = H(i,j)
+          end do
+       end do
+
+       !For degenerate eigenvalues, dsyev returns non-orthogonal eigenvectors
+       !had to switch to dsyevd
+       lwork = 1 + 6*ndet + 2*ndet**2
+       liwork = 3 + 5*ndet
+       allocate(rwork(lwork))
+       allocate(iwork(liwork))
+       rwork(:) = 0.d0     
+       
+       call dsyevd ('V', 'U', Ndet, V, ndet, E, rwork, lwork, iwork, liwork, info)
+       deallocate(rwork)
+       deallocate(iwork)
+
+       if (info.ne.0) then
+          write(iout,*)
+          write(iout,*) " Info =", info
+          call SASS_quit("***** Erreur diag. mat. sym. dsyevd *****",iout)
+          write(iout,*)
+          flush(iout)
+       end if
+
+    else if (idiag.eq.-1) then 
+
+       k = max(1, 3*Ndet-2)
+       allocate (hcgiven(ndet,ndet), work(3*ndet), rwork(k))
+       v(:,:) = 0.d0
+       hcgiven(1:ndet,1:ndet) = (0.d0,0d0)
+       do j=1,ndet
+          do i=j,ndet
+             hcgiven(i,j) = cmplx ( 0.d0, h(i,j), kind = 8 ) 
+          end do
+       end do
+       work (:) = (0.d0, 0.d0)
+       rwork (:) = 0.d0
+       call zheev ('V', 'L', Ndet, hcgiven, ndet, E, WORK, 3*ndet, RWORK, info)
+       deallocate (work,rwork)
+       deallocate(hcgiven)
+       if (info.eq.0) then
+          return
+       else 
+          write(iout,*)
+          write(iout,*) " Info =", info
+          flush(iout)
+          call SASS_quit("***** Erreur diag. mat. antisym. *****",iout)
+       end if
+
+    else
+       write(iout,*) "  idiag =", idiag
+       flush(iout)
+       call SASS_quit(" ***** Erreur idiag *****",iout)
+    end if
+
+  end subroutine diag
+
diff --git a/src/dimensions.F90 b/src/dimensions.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e6be5cfdefc4d37bd0066c46ed7b670eeaf3a4b8
--- /dev/null
+++ b/src/dimensions.F90
@@ -0,0 +1,210 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!----
+
+!> @brief Definition des parametres 
+module dimensions 
+
+#ifdef VAR_OMP
+  !$ use OMP_LIB
+#endif
+  
+#ifdef VAR_MPI
+#ifdef VAR_GNU
+  use mpi
+#elif VAR_INTEL
+  include "mpif.h"
+#endif
+#endif
+
+  !> @brief Nb of bits for a real
+  integer, parameter :: realk = selected_real_kind(15, 307)
+  !> @brief kd_int     : nbre d'octets pour un entier standart
+  Integer, parameter :: kd_int = 4
+  !> @brief kd_dble    : nbre d'octets pour un double standart
+  integer, parameter :: kd_dble = 8
+  !> @brief NACT_MAX   : nbre max d'orbitales actives
+  Integer (KIND=kd_int), parameter ::  NACT_MAX = 32
+  !> @brief kindact    : nbre d'octets sur lesquels sont codés les actives
+  integer (kind=kd_int), parameter :: kindact = 8
+  !> @brief kindTP     : nbre d'octets pour un trou/part avec son spin
+  Integer (KIND=kd_int), parameter ::  kindTP = 2 
+  !> @brief IRREP_MAX  : nbre maximum d'irrep
+  Integer (KIND=kd_int), parameter :: IRREP_MAX = 8
+  !> @brief NREF0_MAX  : nbre maximum de ref0
+  Integer (KIND=kd_int), parameter :: NREF0_MAX = 10
+  !> @brief NPROP_MAX  : nbre maximum de proprietes
+  Integer (KIND=kd_int), parameter :: nprop_max = 10
+  !> @brief MxOrb      : nbre maximum d'orbitales dans Molcas
+  Integer (KIND=kd_int), public :: MxOrb=10000
+  !> @brief DEBUG      : Impressions de  debuggage
+#ifdef VAR_DEBUG
+  Logical, parameter :: DEBUG=.true.
+#else
+  Logical, parameter :: DEBUG=.false.
+#endif
+#ifdef VAR_NOGEN
+  !> @brief Do not use generated code
+  Logical, parameter :: lgen=.false.
+#else
+  !> @brief Use Generated code
+  Logical, parameter :: lgen=.true.
+#endif
+  !> @brief Number of hole-particle cases
+  integer, parameter :: num_cases = 31
+
+contains
+
+  !$==================================================================== 
+  !> @brief Quit with error message msg
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine SASS_quit(msg, iout)
+
+    implicit none
+
+    character(len=*), intent(in) :: msg
+    integer, intent(in) :: iout
+
+    write(iout,'(A)') msg
+    flush(iout)
+    stop 1
+
+  end subroutine SASS_quit
+
+  !> \brief Return elapsed CPU time and elapsed real time.
+  !> \author H. J. Aa. Jensen. Modified by S. Host
+  !> \date December 18, 1984
+  subroutine gettime(cputime,walltime)
+    
+    implicit none
+    real(kd_dble), intent(out) :: cputime, walltime
+
+    real(kd_dble),PARAMETER :: D0 = 0.0E0_kd_dble
+    logical    :: first = .true.
+    real(kd_dble), save :: TCPU0, twall0
+    real(kd_dble)       :: tcpu1, twall1
+    integer        :: dateandtime0(8), dateandtime1(8)
+    dateandtime0 = 0
+    dateandtime1 = 0
+
+    if (first) then
+       first = .false.
+       call cpu_time(TCPU0)
+       call date_and_time(values=dateandtime0)
+       call get_walltime(dateandtime0,twall0)
+    end if
+    call cpu_time(tcpu1)
+    call date_and_time(values=dateandtime1)
+    call get_walltime(dateandtime1,twall1)
+
+    cputime = tcpu1 - TCPU0
+    walltime = twall1 - twall0
+
+  end subroutine gettime
+
+  !> \brief Get elapsed walltime in seconds since 1/1-2010 00:00:00
+  !> \author S. Host
+  !> \date October 2010
+  !>
+  !> Years that are evenly divisible by 4 are leap years. 
+  !> Exception: Years that are evenly divisible by 100 are not leap years, 
+  !> unless they are also evenly divisible by 400. Source: Wikipedia
+  !>
+  subroutine get_walltime(dateandtime,walltime)
+    
+    implicit none
+    !> "values" output from fortran intrinsic subroutine date_and_time
+    integer, intent(in) :: dateandtime(8)
+    !> Elapsed wall time in seconds
+    real(kd_dble), intent(out) :: walltime
+    integer                  :: month, year
+
+    ! The output from the fortran intrinsic date_and_time
+    ! gives the following values:
+    ! 1. Year
+    ! 2. Month
+    ! 3. Day of the month
+    ! 4. Time difference in minutes from Greenwich Mean Time (GMT)
+    ! 5. Hour
+    ! 6. Minute
+    ! 7. Second
+    ! 8. Millisecond
+
+    ! Count seconds, minutes, hours, days, months and years and sum up seconds:
+    ! We don't count milliseconds.
+
+    walltime = 0.0E0_kd_dble
+
+    walltime = dble(dateandtime(8))/1.0E3_kd_dble                !Seconds counted
+
+    walltime = walltime + dble(dateandtime(7))                 !Seconds counted
+
+    walltime = walltime + 60E0_kd_dble*dateandtime(6)            !Minutes counted
+
+    walltime = walltime + 3600E0_kd_dble*dateandtime(5)          !Hours counted
+
+    walltime = walltime + 24E0_kd_dble*3600E0_kd_dble*(dateandtime(3)-1) !Days counted (substract 1 to count only whole days)
+
+    !Months are special, since they are not equally long:
+
+    do month = 1, dateandtime(2)-1 !substract 1 to count only whole months
+       if (month == 1 .or. month == 3 .or. month == 5 .or. month == 7 .or. &
+            &  month == 8 .or. month == 10) then !Since we subtract 1, month can never be 12
+          walltime = walltime + 31E0_kd_dble*24E0_kd_dble*3600E0_kd_dble
+       else if (month == 2) then
+          if (.false.) then !insert exception for if current year is a leap year
+             walltime = walltime + 29E0_kd_dble*24E0_kd_dble*3600E0_kd_dble
+          else
+             walltime = walltime + 28E0_kd_dble*24E0_kd_dble*3600E0_kd_dble
+          endif
+       else if (month == 4 .or. month == 6 .or. month == 9 .or. month == 11) then
+          walltime = walltime + 30E0_kd_dble*24E0_kd_dble*3600E0_kd_dble
+       else
+          stop 'Unknown month (get_walltime)'
+       endif
+    enddo
+
+    !Years are special, since leap years are one day longer:
+
+    do year = 2010, dateandtime(1) 
+       if (mod(year,400)==0) then
+          walltime = walltime + 366*24*3600 !Leap year
+       else if (mod(year,100)==0) then
+          walltime = walltime + 365*24*3600 !Not leap year
+       else if (mod(year,4)==0) then
+          walltime = walltime + 366*24*3600 !Leap year
+       else
+          walltime = walltime + 365*24*3600 !Not leap year
+       endif
+    enddo
+
+  end subroutine get_walltime
+
+End module dimensions
diff --git a/src/explicit_Hmat.F90 b/src/explicit_Hmat.F90
new file mode 100644
index 0000000000000000000000000000000000000000..94c6ab8164ffa1ef73806e9b74e2ac280ef780e9
--- /dev/null
+++ b/src/explicit_Hmat.F90
@@ -0,0 +1,998 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module explicit_Hmat
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use typebraket
+
+  implicit none
+
+contains
+
+
+  !$====================================================================
+  !> @brief Compute explicitely <Idet|H|Jdet>
+  !> @author ER and RB
+  !> @date June 2019
+  !
+  !> @param idet Index of determinant I
+  !> @param jdet Index of determinant J
+  !> @param det List of all determinants
+  !> @param fock Fock matrix
+  !> @param hdiag Diagonal of the Hamiltonian matrix
+  !> @param g_info General info
+  !> @param prog_info Program Info
+  !> @param o_info Orbital info
+  !> @param int_info Integral info
+  !> @param v_info Info on the vectors
+  !> @param ener_info Energy info
+  !> @param iout Output unit
+  !> @return explicit_Hij Value of the matrix element <Idet|H|Jdet>
+  !
+  !> there is two output files (usually fort.60 and fort.61) the first
+  !> one is a telling us the number of excitations between det I and J, 
+  !> but also which integrals were needed in this case and their signs.
+  !> fort.61 is filled with minimal informations (: idet, jdet, result)
+  !> in order to be compared with the results of the generated program
+  !> in debug mode. To use this programme, lexplicit=.true. should be
+  !> in the INPUT file.
+  !$==================================================================== 
+  function explicit_Hij(idet, jdet, det, fock, hdiag, g_info, prog_info, &
+       o_info, int_info, v_info, ener_info, iout)
+
+    real(kd_dble)                                            :: explicit_Hij
+    integer, intent(in)                                      :: idet, jdet
+    type(deter), dimension(:), allocatable                   :: det
+    real(kd_dble), dimension(:,:), allocatable, intent(in)   :: fock 
+    real(kd_dble), dimension(:), allocatable                 :: hdiag
+    type(g_infotype), intent(in)                             :: g_info
+    type(prog_infotype), intent(in)                          :: prog_info
+    type(o_infotype), intent(in)                             :: o_info  
+    type(int_infotype), intent(in)                           :: int_info
+    type(v_infotype), intent(in)                             :: v_info
+    type(ener_infotype), intent(inout)                       :: ener_info
+    integer, intent(in)                                      :: iout
+    
+
+    !Local variables
+    type(deter) :: detI, detJ
+    type(braket) :: Hij
+    integer (Kind= kindact) :: diffI, diffJ, and_IJ
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, nelact
+    integer :: signact, sign, signt, signp
+    integer, dimension(:), allocatable :: ai, aj, si, sj, a, s
+    integer :: ndiffI, ndiffJ, nandIJ, nhI, nhJ, ndiffh, Ndiffp, Ndifftot
+    integer :: i
+    real(kd_dble) :: elm
+
+
+    !Initialisation
+    ngel    = o_info%ngel
+    nocc    = o_info%nocc
+    nligo   = o_info%nligo
+    nact    = o_info%nact
+    nligv   = o_info%nligv
+    nvirt   = o_info%nvirt
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    nelact = g_info%nelact
+    Ndiffh = 0
+    Ndiffp = 0
+
+    explicit_Hij = 0.0d0
+    elm = 0.0d0
+
+    allocate(a(2*nact), ai(2*nact), aj(2*nact))
+    allocate(s(2*nact), si(2*nact), sj(2*nact))
+
+    detI = det(idet)
+    detJ = det(jdet)
+    
+    write(iout, *) ' '
+    write(iout, *) '------------------------------------'
+    write(iout, '(A,I4,A,I4,A)',advance='yes') &
+         'Explicit matrix element for <',idet,'|H|',jdet,'>'
+    write(iout, *) ' '
+
+    call wrtdet(detI, iout, o_info)
+    call wrtdet(detJ, iout, o_info)
+
+    sign = 1
+    signt = 1
+    signp = 1
+    nhI = 0
+    nhJ = 0
+
+    !Fill Hij from detI and detJ
+    call braket_init(Hij)
+
+    !Hole t1
+    Hij%sot1 = detI%dettr(1)
+    if (Hij%sot1 .ne. 0) then
+       if (Hij%sot1 .le. 2*ngel + nocc + nligo) then
+          Hij%t1 = Hij%sot1 - ngel
+          Hij%spint1 = 1
+       else
+          Hij%t1 = Hij%sot1 - ngel - nocc - nligo
+          Hij%spint1 = -1
+       endif
+       signt = (-1)**(Hij%sot1 -1)
+       nhI = 1
+    endif
+
+    !Hole t2
+    Hij%sot2 = detI%dettr(2)
+    if (Hij%sot2 .ne. 0) then
+       if (Hij%sot2 .le. 2*ngel + nocc + nligo) then
+          Hij%t2 = Hij%sot2 - ngel
+          Hij%spint2 = 1
+       else
+          Hij%t2 = Hij%sot2 - ngel - nocc - nligo
+          Hij%spint2 = -1
+       endif
+       nhI = 2
+    endif
+
+    !Hole t3
+    Hij%sot3 = detJ%dettr(1)
+    if (Hij%sot3 .ne. 0) then
+       if (Hij%sot3 .le. 2*ngel + nocc + nligo) then
+          Hij%t3 = Hij%sot3 - ngel
+          Hij%spint3 = 1
+       else
+          Hij%t3 = Hij%sot3 - ngel - nocc - nligo
+          Hij%spint3 = -1
+       endif
+       nhJ = 1
+    endif
+
+    !Hole t4
+    Hij%sot4 = detJ%dettr(2)
+    if (Hij%sot4 .ne. 0) then
+       if (Hij%sot4 .le. 2*ngel + nocc + nligo) then
+          Hij%t4 = Hij%sot4 - ngel
+          Hij%spint4 = 1
+       else
+          Hij%t4 = Hij%sot4 - ngel - nocc - nligo
+          Hij%spint4 = -1
+       endif
+       nhJ = 2
+    endif
+
+   !Particule p1
+    Hij%sop1 = detI%detprt(1)
+    if (Hij%sop1 .ne. 0) then
+       if (Hij%sop1 .le. 2*ngel + 2*nocc + 2*nligo + 2*nact + nligv + nvirt) then
+          Hij%p1 = Hij%sop1 - ngel - nocc - nligo - nact
+          Hij%spinp1 = 1
+       else
+          Hij%p1 = Hij%sop1 - ngel - nocc - nligo - nact - nligv - nvirt
+          Hij%spinp1 = -1
+       endif
+    endif
+
+    !Particule p2
+    Hij%sop2 = detI%detprt(2)
+    if (Hij%sop2 .ne. 0) then
+       if (Hij%sop2 .le. 2*ngel + 2*nocc + 2*nligo + 2*nact + nligv + nvirt) then
+          Hij%p2 = Hij%sop2 - ngel - nocc - nligo - nact
+          Hij%spinp2 = 1
+       else
+          Hij%p2 = Hij%sop2 - ngel - nocc - nligo - nact - nligv - nvirt
+          Hij%spinp2 = -1
+       endif
+    endif
+
+    !Particule p3
+    Hij%sop3 = detJ%detprt(1)
+    if (Hij%sop3 .ne. 0) then
+       if (Hij%sop3 .le. 2*ngel + 2*nocc + 2*nligo + 2*nact + nligv + nvirt) then
+          Hij%p3 = Hij%sop3 - ngel - nocc - nligo - nact
+          Hij%spinp3 = 1
+       else
+          Hij%p3 = Hij%sop3 - ngel - nocc - nligo - nact - nligv - nvirt
+          Hij%spinp3 = -1
+       endif
+    endif
+
+    !Particule p4
+    Hij%sop4 = detJ%detprt(2)
+    if (Hij%sop4 .ne. 0) then
+       if (Hij%sop4 .le. 2*ngel + 2*nocc + 2*nligo + 2*nact + nligv + nvirt) then
+          Hij%p4 = Hij%sop4 - ngel - nocc - nligo - nact
+          Hij%spinp4 = 1
+       else
+          Hij%p4 = Hij%sop4 - ngel - nocc - nligo - nact - nligv - nvirt
+          Hij%spinp4 = -1
+       endif
+    endif
+
+    !Modifications du signe dûes aux permutations des orbitales virtuelles
+	if ( (Hij%sop1 == 0) .and. (Hij%sop3 == 0) ) then !0000 (P1 P2 P3 P4)
+		signp = +1
+
+	else if ( (Hij%sop1 /= 0) .and. (Hij%sop3 == 0) ) then !1?00
+		if ( Hij%sop2 == 0 ) then!1000
+			signp = (-1)**(nelact-1)
+		else !1200
+			signp = +1
+		end if
+
+	else if ( (Hij%sop1 == 0) .and. (Hij%sop3 /= 0) ) then !003?
+		if ( Hij%sop4 == 0 ) then  !0030
+			signp = (-1)**(nelact-1)
+		else !0034
+			signp = +1
+		end if
+
+	else if ( (Hij%sop2 == 0) .and. (Hij%sop4 == 0) ) then !1030
+		if ( Hij%sop1 == Hij%sop3 ) then 
+			signp = +1
+		else
+			signp = +1
+		end if
+
+	else if ( (Hij%sop2 /=0) .and. (Hij%sop4 == 0) ) then  !1230
+		if ( Hij%sop3 == Hij%sop1 ) then 
+			signp = (-1)**(nelact-1)
+		else if ( Hij%sop3 == Hij%sop2 ) then 
+			signp = (-1)**nelact
+		else
+			signp = (-1)**(nelact-1)
+		end if
+
+	else if ( (Hij%sop2 == 0) .and. (Hij%sop4 /= 0) ) then  !1034
+		if ( Hij%sop1 == Hij%sop3 ) then 
+			signp = (-1)**(nelact-1)
+		else if ( Hij%sop1 == Hij%sop4 ) then 
+			signp = (-1)**nelact
+		else
+			signp = (-1)**(nelact-1)
+		end if
+
+	else if ( (Hij%sop2 /= 0) .and. (Hij%sop4 /= 0) ) then  !1234
+		if ( (Hij%sop1 == Hij%sop3) .and. (Hij%sop2 == Hij%sop4) ) then
+			signp = +1
+		else if ( Hij%sop1 == Hij%sop3 ) then 
+			signp = +1
+		else if ( Hij%sop2 == Hij%sop4 ) then 
+			signp = +1
+		else if ( (Hij%sop1 == Hij%sop4) .or. (Hij%sop2 == Hij%sop3) ) then 
+			signp = -1
+		else
+			signp = +1
+		end if
+	end if
+
+	!Modifications du signe dûes aux permutations des orbitales occupées
+	if ( (Hij%sot1 == 0) .and. (Hij%sot3 == 0) ) then  !0000 (T1 T2 T3 T4)
+		signt = +1
+
+	else if ( (Hij%sot1 /= 0) .and. (Hij%sot3 == 0) ) then  !1?00
+		if ( Hij%sot2 == 0 ) then  !1000
+			signt = (-1)**(Hij%sot1-1)
+		else !1200
+			signt = (-1)**(Hij%sot1+Hij%sot2)
+		end if
+
+	else if ( (Hij%sot1 == 0) .and. (Hij%sot3 /= 0) ) then  !003?
+		if ( Hij%sot4 == 0 ) then  !0030
+			signt = (-1)**(Hij%sot3-1)
+		else !0034
+			signt = (-1)**(Hij%sot3+Hij%sot4)
+		end if
+
+	else if ( (Hij%sot2 == 0) .and. (Hij%sot4 == 0) ) then !1030
+		if ( Hij%sot1 == Hij%sot3 ) then 
+			signt = +1
+		else
+			signt = (-1)**(Hij%sot1+Hij%sot3-1)
+		end if
+
+	else if ( (Hij%sot2 /=0) .and. (Hij%sot4 == 0) ) then  !1230
+		if ( Hij%sot3 == Hij%sot1 ) then 
+			signt = (-1)**(Hij%sot2-1)
+		else if ( Hij%sot3 == Hij%sot2 ) then 
+			signt = (-1)**Hij%sot1
+		else
+			signt = (-1)**(Hij%sot1+Hij%sot2+Hij%sot3-1)
+		end if
+
+	else if ( (Hij%sot2 == 0) .and. (Hij%sot4 /= 0) ) then  !1034
+		if ( Hij%sot1 == Hij%sot3 ) then 
+			signt = (-1)**(Hij%sot4-1)
+		else if ( Hij%sot1 == Hij%sot4 ) then 
+			signt = (-1)**Hij%sot3
+		else
+			signt = (-1)**(Hij%sot3+Hij%sot4+Hij%sot1-1)
+		end if
+
+	else if ( (Hij%sot2 /= 0) .and. (Hij%sot4 /= 0) ) then  !1234
+		if ( (Hij%sot1 == Hij%sot3) .and. (Hij%sot2 == Hij%sot4) ) then 
+			signt = +1
+		else if ( Hij%sot1 == Hij%sot3 ) then 
+			signt = (-1)**(Hij%sot2+Hij%sot4-1)
+		else if ( Hij%sot2 == Hij%sot4 ) then 
+			signt = (-1)**(Hij%sot1+Hij%sot3-1)
+		else if ( Hij%sot1 == Hij%sot4 ) then 
+			signt = (-1)**(Hij%sot2+Hij%sot3)
+		else if ( Hij%sot2 == Hij%sot3  ) then 
+			signt = (-1)**(Hij%sot1+Hij%sot4)
+		else
+			signt = (-1)**(Hij%sot1+Hij%sot2+Hij%sot3+Hij%sot4)
+		end if
+	end if
+	
+	
+    !Active part of the determinants    
+    Hij%detactI = detI%detact
+    Hij%detactJ = detJ%detact
+
+    !Get nb of differences for active parts and sign 
+    call sign_diff(Hij%detactI, Hij%detactJ, diffI, diffJ, and_IJ, signact, nact)
+
+    call extract_orbindx_from_detact(diffI, ai, si, no, nact, ndiffI)
+    call extract_orbindx_from_detact(diffJ, aj, sj, no, nact, ndiffJ)
+    call extract_orbindx_from_detact(and_ij, a, s, no, nact, nandIJ)
+
+    !Get nb of differences for holes
+    if ((Hij%sot1 .ne. 0) .and. (Hij%sot1 .ne. Hij%sot3) .and. &
+         (Hij%sot1 .ne. Hij%sot4)) Ndiffh = Ndiffh + 1
+    if ((Hij%sot2 .ne. 0) .and. (Hij%sot2 .ne. Hij%sot3) .and. &
+         (Hij%sot2 .ne. Hij%sot4)) Ndiffh = Ndiffh + 1
+    if ((Hij%sot3 .ne. 0) .and. (Hij%sot1 .ne. Hij%sot3) .and. &
+         (Hij%sot2 .ne. Hij%sot3)) Ndiffh = Ndiffh + 1
+    if ((Hij%sot4 .ne. 0) .and. (Hij%sot1 .ne. Hij%sot4) .and. &
+         (Hij%sot2 .ne. Hij%sot4)) Ndiffh = Ndiffh + 1
+
+    !Get nb of differences for particules
+    if ((Hij%sop1 .ne. 0) .and. (Hij%sop1 .ne. Hij%sop3) .and. &
+         (Hij%sop1 .ne. Hij%sop4)) Ndiffp = Ndiffp + 1
+    if ((Hij%sop2 .ne. 0) .and. (Hij%sop2 .ne. Hij%sop3) .and. &
+         (Hij%sop2 .ne. Hij%sop4)) Ndiffp = Ndiffp + 1
+    if ((Hij%sop3 .ne. 0) .and. (Hij%sop1 .ne. Hij%sop3) .and. &
+         (Hij%sop2 .ne. Hij%sop3)) Ndiffp = Ndiffp + 1
+    if ((Hij%sop4 .ne. 0) .and. (Hij%sop1 .ne. Hij%sop4) .and. &
+         (Hij%sop2 .ne. Hij%sop4)) Ndiffp = Ndiffp + 1
+
+    !Total number of differences
+    Ndifftot = Ndiffp + Ndiffh + NdiffI+ NdiffJ
+    
+    if (Ndifftot .eq. 0) then
+       write(iout,*) 'Diagonal Case'
+       explicit_Hij = hdiag(idet)
+       goto 100
+    else if (Ndifftot .eq. 2) then
+       write(iout,*) '1 excitation'
+       call compute_hij(elm, Hij, fock, Ndiffp, NdiffI + NdiffJ, Ndiffh, &
+            o_info, int_info, iout)
+    else if (Ndifftot .eq. 4) then
+       write(iout,*) '2 excitations'
+       call compute_hij(elm, Hij, fock,  Ndiffp, NdiffI + NdiffJ, Ndiffh, &
+            o_info, int_info, iout)
+    else
+       write(iout,*) 'Zero case'
+    endif
+   
+    !Compute sign
+    sign = signact * signt * (-1)**(nhI * ndiffI + nhJ * ndiffJ) *signp
+
+
+    !Printing
+    if (sign .eq. 1) then 
+       write(iout,'(A)',advance='no') '+'
+    else
+       write(iout,'(A)', advance='no') '-'
+    endif
+    write(iout,'(A)',advance='no') '<'
+    if (Hij%sop2 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%p2
+       if (Hij%spinp2 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    if (Hij%sop1 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%p1
+       if (Hij%spinp1 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    do i = 1, ndiffI
+       write(iout,'(I0)',advance='no') ai(i)
+       if (si(i) .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    enddo
+    if (Hij%sot4 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%t4
+       if (Hij%spint4 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    if (Hij%sot3 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%t3
+       if (Hij%spint3 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+
+    write(iout,'(A)',advance='no') 'det|H|'
+    if (Hij%sop4 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%p4
+       if (Hij%spinp4 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    if (Hij%sop3 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%p3
+       if (Hij%spinp3 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    do i = 1, ndiffJ
+       write(iout,'(I0)',advance='no') aj(i)
+       if (sj(i) .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    enddo
+    if (Hij%sot2 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%t2
+       if (Hij%spint2 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    if (Hij%sot1 .ne. 0 ) then
+       write(iout,'(I0)',advance='no') Hij%t1
+       if (Hij%spint1 .eq. 1) then
+          write(iout,'(A)',advance='no') 'u '
+       else
+          write(iout,'(A)',advance='no') 'd '
+       endif
+    endif
+    write(iout,'(A)',advance='no') 'det> = '
+
+    if (sign .eq. 1) then 
+       write(iout,*) elm
+       explicit_Hij = elm
+       
+    else
+       write(iout,*) -elm
+       explicit_Hij = -elm
+    endif
+
+100 deallocate(a, ai, aj, s, si, sj)
+    
+  end function explicit_Hij
+
+
+   
+  !$====================================================================
+  !> @brief Compute explicitely the "ordered hij" where the sign has
+  !! been dealt with externally for non-zero off-diagonal terms
+  !> @author ER
+  !> @date May 2019
+  !
+  !> @param[out] elm value of the matrix element 
+  !> @param Hij braket type containing the info about <I|H|J>
+  !> @param fock Fock matrix
+  !> @param Ndiffact number of difference in the active parts
+  !> @param Ndiffh Number of differences in the hole parts
+  !> @param Ndiffp Number of differences in the particle parts
+  !> @param o_info Orbital info
+  !> @param int_info Integral info
+  !> @param iout Output unit
+  !$==================================================================== 
+  subroutine compute_hij(elm, Hij, fock, Ndiffp, Ndiffact, Ndiffh, &
+       o_info, int_info, iout)
+
+    type(braket) :: Hij
+    integer :: Ndiffp, Ndiffact, Ndiffh, iout
+    type(o_infotype), intent(in)               :: o_info
+    type(int_infotype) :: int_info
+    real(kd_dble), intent(out) :: elm
+    real(kd_dble), dimension(:,:), allocatable, intent(in)   :: fock
+
+    real(kd_dble) :: elmx, elmtmp
+
+    integer :: diff1, diff2, diff3, diff4
+    integer :: spindiff1, spindiff2, spindiff3, spindiff4
+    integer :: andp1, andp2, andt1, andt2
+    integer :: spinandp1, spinandp2, spinandt1, spinandt2
+    integer (Kind= kindact) :: diffI, diffJ, and_IJ
+    integer :: ndiffI, ndiffJ, nandIJ
+    integer, dimension(:), allocatable :: ai, aj, si, sj, a, s
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no
+    integer :: signact
+    integer :: k, sp
+    
+    elm = 0.0d0
+    elmx = 0.0d0
+    
+    ngel    = o_info%ngel
+    nocc    = o_info%nocc
+    nligo   = o_info%nligo
+    nact    = o_info%nact
+    nligv   = o_info%nligv
+    nvirt   = o_info%nvirt
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    allocate(a(2*nact), ai(2*nact), aj(2*nact))
+    allocate(s(2*nact), si(2*nact), sj(2*nact))
+
+    diff1 = 0
+    diff2 = 0
+    diff3 = 0
+    diff4 = 0
+
+    spindiff1 = 0
+    spindiff2 = 0
+    spindiff3 = 0
+    spindiff4 = 0
+
+    andp1 = 0
+    andp2 = 0
+    andt1 = 0
+    andt2 = 0
+
+    spinandp1 = 0
+    spinandp2 = 0
+    spinandt1 = 0
+    spinandt2 = 0
+
+    !Get differences for particules
+    if (Hij%sop1 .ne. 0) then
+       if ((Hij%sop1 .ne. Hij%sop3) .and. (Hij%sop1 .ne. Hij%sop4)) then
+          diff1 = Hij%p1
+          spindiff1 = Hij%spinp1
+       else
+          andp1 = Hij%p1
+          spinandp1 = Hij%spinp1
+       endif
+
+       if (Hij%sop2 .ne. 0) then
+          if ((Hij%sop2 .ne. Hij%sop3) .and. (Hij%sop2 .ne. Hij%sop4)) then
+             if (diff1 .eq. 0) then
+                diff1 =  Hij%p2
+                spindiff1 = Hij%spinp2
+             else
+                diff2 =  Hij%p2
+                spindiff2 = Hij%spinp2
+             endif
+          else
+             if (andp1 .eq. 0) then
+                andp1 = Hij%p2
+                spinandp1 = Hij%spinp2
+             else
+                andp2 = Hij%p2
+                spinandp2 = Hij%spinp2
+             endif
+          endif
+       endif
+    endif
+
+    if ((Hij%sop3 .ne. 0) .and. (Hij%sop1 .ne. Hij%sop3) .and. &
+         (Hij%sop2 .ne. Hij%sop3)) then
+       diff3 = Hij%p3
+       spindiff3 = Hij%spinp3
+    endif
+    if ((Hij%sop4 .ne. 0) .and. (Hij%sop1 .ne. Hij%sop4) .and. &
+         (Hij%sop2 .ne. Hij%sop4)) then
+       if (diff3 .eq. 0) then
+          diff3 =  Hij%p4
+          spindiff3 = Hij%spinp4
+       else
+          diff4 =  Hij%p4
+          spindiff4 = Hij%spinp4
+       endif
+    endif
+
+    !Get differences for active
+
+    call sign_diff(Hij%detactI, Hij%detactJ, diffI, diffJ, and_IJ, signact, nact)
+
+    call extract_orbindx_from_detact(diffI, ai, si, no, nact, ndiffI)
+    call extract_orbindx_from_detact(diffJ, aj, sj, no, nact, ndiffJ)
+    call extract_orbindx_from_detact(and_ij, a, s, no, nact, nandIJ)
+
+    if (ndiffI .eq. 1) then
+       if (diff1 .eq. 0) then
+          diff1 = aI(1)
+          spindiff1 = sI(1)
+       else
+          diff2 = aI(1)
+          spindiff2 = sI(1)
+       endif
+    else if (ndiffI .eq. 2) then
+       diff1 = aI(1)
+       spindiff1 = sI(1)
+       diff2 = aI(2)
+       spindiff2 = sI(2)
+    endif
+
+    if (ndiffJ .eq. 1) then
+       if (diff3 .eq. 0) then
+          diff3 = aJ(1)
+          spindiff3 = sJ(1)
+       else
+          diff4 = aJ(1)
+          spindiff4 = sJ(1)
+       endif
+    else if (ndiffJ .eq. 2) then
+       diff3 = aJ(1)
+       spindiff3 = sJ(1)
+       diff4 = aJ(2)
+       spindiff4 = sJ(2)
+    endif
+    
+    !Get differences for holes
+    if (Hij%sot1 .ne. 0) then
+       if ((Hij%sot1 .ne. Hij%sot3) .and. (Hij%sot1 .ne. Hij%sot4)) then
+          if (diff3 .eq. 0) then
+             diff3 = Hij%t1
+             spindiff3= Hij%spint1
+          else
+             diff4 = Hij%t1
+             spindiff4= Hij%spint1
+          endif
+       else
+          andt1 = Hij%t1
+          spinandt1 = Hij%spint1
+       endif
+
+       if (Hij%sot2 .ne. 0) then
+          if ((Hij%sot2 .ne. Hij%sot3) .and. (Hij%sot2 .ne. Hij%sot4)) then
+             if (diff3 .eq. 0) then
+                diff3 =  Hij%t2
+                spindiff3 = Hij%spint2
+             else
+                diff4 =  Hij%t2
+                spindiff4 = Hij%spint2
+             endif
+          else
+             if (andt1 .eq. 0) then
+                andt1 = Hij%t2
+                spinandt1 = Hij%spint2
+             else
+                andt2 = Hij%t2
+                spinandt2 = Hij%spint2
+             endif
+          endif
+       endif
+    endif
+
+    if ((Hij%sot3 .ne. 0) .and. (Hij%sot1 .ne. Hij%sot3) .and. &
+         (Hij%sot2 .ne. Hij%sot3)) then
+       if (diff1 .eq. 0) then
+          diff1 = Hij%t3
+          spindiff1 = Hij%spint3
+       else
+          diff2 = Hij%t3
+          spindiff2 = Hij%spint3
+       endif
+    endif
+    if ((Hij%sot4 .ne. 0) .and. (Hij%sot1 .ne. Hij%sot4) .and. &
+         (Hij%sot2 .ne. Hij%sot4)) then
+       if (diff1 .eq. 0) then
+          diff1 =  Hij%t4
+          spindiff1 = Hij%spint4
+       else
+          diff2 =  Hij%t4
+          spindiff2 = Hij%spint4
+       endif
+    endif
+
+
+    !Two excitation
+    if (diff2.ne.0) then
+       if (spindiff1 .eq. spindiff3) then
+          call  get_explicit_int(diff1,diff3,diff2,diff4, &
+               o_info, int_info, elm,iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '<',diff1,diff2,'|',diff3,diff4,'>'     
+       endif
+       
+       if (spindiff1 .eq. spindiff4) then
+          call  get_explicit_int(diff1,diff4,diff2,diff3, &
+               o_info, int_info, elmx, iout)    
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '<',diff1,diff2,'|',diff4,diff3,'>' 
+       endif
+
+       elm = elm - elmx
+    else
+       !One excitation
+       elm = fock(diff1,diff3)
+       write(iout,'(A,I4,A,I4,A)') '<',diff1,'|',diff3,'>'
+       if (andp1 .ne. 0 ) then !somme particule1
+          call get_explicit_int(diff1,diff3,andp1,andp1, &
+               o_info, int_info, elmtmp, iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '+<',diff1,andp1,'|',diff3,andp1,'>'
+          elm = elm + elmtmp
+          if (spindiff1 .eq. spinandp1) then
+             call get_explicit_int(diff1,andp1,diff3,andp1, &
+                  o_info, int_info, elmtmp, iout)
+             write(iout,'(A,I4,I4,A,I4,I4,A)') '-<',diff1,andp1,'|',andp1,diff3,'>'
+             elm = elm - elmtmp
+          endif
+       endif
+
+       if (andp2 .ne. 0 ) then !somme particule2
+          call get_explicit_int(diff1,diff3,andp2,andp2, &
+               o_info, int_info, elmtmp, iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '+<',diff1,andp2,'|',diff3,andp2,'>'
+          elm = elm + elmtmp
+          if (spindiff1 .eq. spinandp2) then
+             call get_explicit_int(diff1,andp2,diff3,andp2, &
+               o_info, int_info, elmtmp, iout)
+             write(iout,'(A,I4,I4,A,I4,I4,A)') '-<',diff1,andp2,'|',andp2,diff3,'>'
+             elm = elm - elmtmp
+          endif
+       endif
+       
+       if (andt1 .ne. 0 ) then !retirer le trou 1
+          call get_explicit_int(diff1,diff3,andt1,andt1, &
+               o_info, int_info, elmtmp, iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '-<',diff1,andt1,'|',diff3,andt1,'>'
+          elm = elm - elmtmp
+          if (spindiff1 .eq. spinandt1) then
+             call get_explicit_int(diff1,andt1,diff3,andt1, &
+               o_info, int_info, elmtmp, iout)
+             write(iout,'(A,I4,I4,A,I4,I4,A)') '+<',diff1,andt1,'|',andt1,diff3,'>'
+             elm = elm + elmtmp
+          endif
+       endif
+       
+       if (andt2 .ne. 0 ) then !retirer le trou 2
+          call get_explicit_int(diff1,diff3,andt2,andt2, &
+               o_info, int_info, elmtmp, iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '-<',diff1,andt2,'|',diff3,andt2,'>'
+          elm = elm - elmtmp
+          if (spindiff1 .eq. spinandt2) then
+             call get_explicit_int(diff1,andt2,diff3,andt2, &
+               o_info, int_info, elmtmp, iout)
+             write(iout,'(A,I4,I4,A,I4,I4,A)') '+<',diff1,andt2,'|',andt2,diff3,'>'
+             elm = elm + elmtmp
+          endif
+       endif
+       
+       do k = 1, nandIJ !somme actives
+          call get_explicit_int(diff1,diff3,a(k),a(k), &
+               o_info, int_info, elmtmp, iout)
+          write(iout,'(A,I4,I4,A,I4,I4,A)') '+<',diff1,a(k),'|',diff3,a(k),'>'
+          elm = elm + elmtmp
+          if (spindiff1 .eq. s(k)) then
+             call get_explicit_int(diff1,a(k),diff3,a(k), &
+                  o_info, int_info, elmtmp, iout)
+             write(iout,'(A,I4,I4,A,I4,I4,A)') '-<',diff1,a(k),'|',a(k),diff3,'>'
+             elm = elm - elmtmp
+          endif
+       enddo
+    endif
+
+    deallocate(a, ai, aj, s, si, sj)
+    
+  end subroutine compute_hij
+
+  !$====================================================================
+  !> @brief Get a specific two-electron integral from disk (m1 m2| m3 m4)
+  !! and add it to elm
+  !> @author ER
+  !> @date May 2019
+  !
+  !> @param m1
+  !> @param m2
+  !> @param m3
+  !> @param m4
+  !> @param o_info Orbital info
+  !> @param int_info Integral info
+  !> @param elm Hamiltonian matrix element being calculated
+  !> @param iout Output unit
+  !$====================================================================
+  subroutine get_explicit_int(m1,m2,m3,m4, o_info, int_info, elm, iout)
+
+    integer :: m1,m2,m3,m4, iout
+    type(o_infotype) :: o_info
+    type(int_infotype) :: int_info
+
+    integer :: n1, n2, n3, n4
+    integer :: ni, nj, nk, nl
+
+    integer :: no, na, nv
+    integer :: i
+
+    character(1) :: s1, s2, s3, s4
+    character(4) :: intname
+    character(4) :: intname2
+    character(4) :: intnamex
+    character(4) :: intnamex2
+    character(4) :: tmp
+    integer :: nintkind
+
+    type(intblock) :: twoint
+    type(intkind_H), dimension(:), allocatable :: intkindlist
+    type(intkind_H) :: intkind
+
+    real(kd_dble) :: elm
+
+    integer :: id_cpu = 0
+    
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    na = no + o_info%nact
+    nv = na + o_info%nligv + o_info%nvirt
+    
+    !Get the canonical ordering (ni nj| nk nl) from (m1 m2| m3 m4)
+    !such that ni >= nj, nk >= nl and ninj >= nknl
+    N1 = M1
+    N2 = M2
+    if (M1.GT.M2) GOTO 511
+    N1 = M2
+    N2 = M1
+511 N3 = M3
+    N4 = M4
+    if (M3.gt.M4) goto 512
+    N3 = M4
+    N4 = M3
+512 NI = N1
+    NJ = N2
+    NK = N3
+    NL = N4
+    if (NI.gt.NK) goto 502
+    if (NI.EQ.NK) goto 514
+    NI = N3
+    NJ = N4
+    NK = N1
+    NL = N2
+    GOTO 502
+514 if (NJ.GT.NL) goto 502
+    NL = N2
+    NJ = N4
+
+502 if (ni .gt. na) then
+       s1 = 'v'
+    else if (ni .gt. no) then
+       s1 = 'a'
+    else
+       s1 = 'o'
+    endif
+    
+    if (nj .gt. na) then
+       s2 = 'v'
+    else if (nj .gt. no) then
+       s2 ='a'
+    else
+       s2 = 'o'
+    endif
+
+    if (nk .gt. na) then
+       s3 = 'v'
+    else if (nk .gt. no) then
+       s3 ='a'
+    else
+       s3 = 'o'
+    endif
+
+    if (nl .gt. na) then
+       s4 = 'v'
+    else if (nl .gt. no) then
+       s4 ='a'
+    else
+       s4 = 'o'
+    endif
+    
+    intname = s1//s2//s3//s4
+    intname2 = s3//s4//s1//s2
+    intnamex = s1//s3//s2//s4
+    intnamex2 = s1//s3//s4//s2
+
+!!$    int_info%CASS_intkind &
+!!$             = (/ 'aaaa', 'aaao', 'vaaa', 'aaoo', 'vaao', 'vvaa','vaoo', &
+!!$             'vvao','vvoo' /)
+
+!!$    (/ "utmp.aaaa", "utmp.aaoo", "utmp.vvaa", &
+!!$         "utmp.vvvv", "utmp.oooo", "utmp.vvoo", "utmp.vvvo", "utmp.vooo", &
+!!$         "utmp.vvva", "utmp.vaaa", "utmp.aaao", "utmp.aooo", "utmp.vaao", &
+!!$         "utmp.vaoo", "utmp.vvao", "utmp.aoao", "utmp.voao", "utmp.vovo", &
+!!$         "utmp.voaa",  "utmp.vava", "utmp.vavo"/)
+    write(iout,*) intname, ' ', intname2,' ', intnamex
+    call intkind_H_all_init(intkindlist, int_info)
+    nintkind = int_info%CASS_nintkind
+    do i = 1, nintkind
+       tmp = int_info%CASS_intkind(i)
+       if (tmp .eq. intname) then
+          !write(*,*) 'intname',tmp
+          call get_intkind(intkindlist, intname, nintkind, intkind)
+          call get_twoint(twoint, intname, o_info, int_info, id_cpu)
+          
+          elm = ijkl(twoint, ni,nj,nk,nl)
+       else if (tmp .eq. intname2) then
+          !write(*,*) 'intname2',tmp
+          call get_intkind(intkindlist, intname2, nintkind, intkind)
+          call get_twoint(twoint, intname2, o_info, int_info, id_cpu)
+          select case ( intkind%ijkl_type )
+          case (2)
+             elm = ijkl2(twoint, nk,nl,ni,nj)
+          case (1)
+             elm = ijkl1(twoint, nk,nl,ni,nj)
+          case (0)
+             elm = ijkl0(twoint, nk,nl,ni,nj)
+          end select
+       else if (tmp .eq. intnamex) then
+          !write(*,*) 'intnamex',tmp
+          call get_intkind(intkindlist, intname, nintkind, intkind)
+          call get_twoint(twoint, intname, o_info, int_info, id_cpu)
+          elm = ijkl(twoint, ni,nj,nk,nl)
+       else if (tmp .eq. intnamex2) then
+          !write(*,*) 'intnamex2',tmp
+          call get_intkind(intkindlist, intnamex2, nintkind, intkind)
+          call get_twoint(twoint, intkind%namex, o_info, int_info, id_cpu)
+          !write(*,*) intkind%namex, intkind%ijkl_type
+          !write(*,*) ni, nj, nk, nl
+          select case ( intkind%ijkl_type )
+          case (2)
+             elm = ijkl2(twoint, nk,nl,ni,nj)
+          case (1)
+             elm = ijkl1(twoint, nk,nl,ni,nj)
+          case (0)
+             elm = ijkl0(twoint, nk,nl,ni,nj)
+          end select
+       else
+          !write(*,*) tmp
+          !flush(6)
+       endif
+    enddo
+
+    !Cleanup
+    call intkind_H_all_free(intkindlist)
+    call intblock_free(twoint)
+  end subroutine get_explicit_int
+  
+  
+end module explicit_Hmat 
diff --git a/src/files.F90 b/src/files.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8c37ef874352d4fa7d2c028085f92cd49b248392
--- /dev/null
+++ b/src/files.F90
@@ -0,0 +1,84 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!> @brief Definition of the logical units
+
+Module files
+
+  Implicit none 
+!!$ -------- Variables ----------------------------------------
+!!$   En entree
+!!$ f_input  : fichier de donnees
+!!$ f_ref0   : liste des det de ref0
+!!$   En sortie
+!!$ f_output : fichier de sortie
+!!$ f_det    : tous les determinants en clair
+!!$ f_bdet   : tous les determinants en binaire
+!!$ f_info   : variables globales x_info
+
+!!$   Autres
+!!$ f_hcore  : Hcore (a voir si vraiment nécessaire)
+!!$ f_mono   : fichier d'intégrales mono-électroniques
+!!$ f_fock   : opérateur de Fock des dble occ + ligand occ
+!!$ f_hcore  : Hcore (a voir si vraiment nécessaire)
+!!$ f_tone   : TraOne
+!!$ f_tint   : TraInt
+!!$ -----------------------------------------------------------
+  integer, parameter :: f_input=1, f_output=7, f_ref0=8, f_det=9, f_bdet=39
+  integer, parameter :: f_fock=10
+  integer, parameter :: f_info=24
+  integer, parameter :: f_gen=14, f_restart = 15, f_gen0 = 16
+  integer, parameter :: f_tone=31, f_tint=32, f_mat=33, f_bmat=34, f_mat2=35
+ 
+  integer :: f_Mono=20
+  integer :: f_aaaa=40, f_aaoo=41, f_vvaa=42
+  integer :: f_vvvv=43, f_oooo=44, f_vvoo=45, f_vvvo=46, f_vooo=47
+  integer :: f_vvva=48, f_vaaa=49, f_aaao=50, f_aooo=51, f_vaao=52
+  integer :: f_vaoo=53, f_vvao=54, f_aoao=55, f_voao=56, f_vovo=57
+  integer :: f_gel = 60
+  integer :: uf_aaaa=140, uf_aaoo=141, uf_vvaa=142
+  integer :: uf_vvvv=143, uf_oooo=144, uf_vvoo=145, uf_vvvo=146, uf_vooo=147
+  integer :: uf_vvva=148, uf_vaaa=149, uf_aaao=150, uf_aooo=151, uf_vaao=152
+  integer :: uf_vaoo=153, uf_vvao=154, uf_aoao=155, uf_voao=156, uf_vovo=157
+  integer :: uf_voaa=158, uf_vava=159, uf_vavo=160
+  integer :: f_debug=99
+
+  integer, parameter :: begunit=140, endunit=160
+  character*9, dimension(begunit:endunit) :: unitname &
+       = (/ "utmp.aaaa", "utmp.aaoo", "utmp.vvaa", &
+       "utmp.vvvv", "utmp.oooo", "utmp.vvoo", "utmp.vvvo", "utmp.vooo", &
+       "utmp.vvva", "utmp.vaaa", "utmp.aaao", "utmp.aooo", "utmp.vaao", &
+       "utmp.vaoo", "utmp.vvao", "utmp.aoao", "utmp.voao", "utmp.vovo", &
+       "utmp.voaa",  "utmp.vava", "utmp.vavo"/)
+
+End Module files
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/fock.F90 b/src/fock.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d5bfe2a11af579fa054ed164c92b1384541e4516
--- /dev/null
+++ b/src/fock.F90
@@ -0,0 +1,236 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module fockmatrix
+
+  use info
+  use utils_twoint
+  use detact
+
+  implicit none
+
+contains
+  
+  !$====================================================================
+  !> @brief Add the 2e- integrals to the bare h_pq to build f_pq
+  !> @author ER
+  !> @date April 2018
+  !$==================================================================== 
+  subroutine build_fock(fock, hcoeur, o_info, int_info, prog_info)
+    
+    Real(KIND=kd_dble), dimension(:,:), allocatable, intent(inout) :: fock
+    Real(KIND=kd_dble), dimension(:,:), allocatable, intent(in) :: hcoeur
+    type(o_infotype), intent(in)         :: o_info
+    type(int_infotype), intent(in)       :: int_info
+    type(prog_infotype), intent(in)      :: prog_info
+
+    type(intblock) :: a, ax
+    integer :: i,j,p
+    integer :: no,na,nv,ng
+
+    ng = o_info%ngel
+    no = o_info%nocc + o_info%nligo
+    na = o_info%nact
+    nv = o_info%nvirt + o_info%nligv
+
+    fock(:,:) = hcoeur(:,:)
+    
+    !OO (oo|oo)
+    call get_twoint(a,'oooo',o_info, int_info, prog_info%id_cpu)
+    do i=ng+1,ng+no
+       do j=i,ng+no
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(a,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo 
+    call intblock_free(a)
+    
+    !OA (ao|oo)
+    call get_twoint(a,'aooo',o_info, int_info, prog_info%id_cpu)
+    do i=ng+no+1,ng+no+na
+       do j=ng+1,ng+no
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(a,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo
+    call intblock_free(a)
+
+    !OV (vo|oo)
+    call get_twoint(a,'vooo',o_info, int_info, prog_info%id_cpu)
+    do i=ng+no+na+1,ng+no+na+nv
+       do j=ng+1,ng+no
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(a,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo 
+    call intblock_free(a)
+    
+     
+    !AA (aa|oo) (ao|ao)
+    call get_twoint(a,'aaoo',o_info, int_info, prog_info%id_cpu)
+    call get_twoint(ax,'aoao',o_info, int_info, prog_info%id_cpu)
+    do i=ng+no+1,ng+no+na
+       do j=i,ng+no+na
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(ax,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo 
+    call intblock_free(a)
+    call intblock_free(ax)
+    
+    !AV (va|oo) (vo|ao)
+    call get_twoint(a,'vaoo',o_info, int_info, prog_info%id_cpu)
+    call get_twoint(ax,'voao',o_info, int_info, prog_info%id_cpu)
+    do i=ng+no+na+1,ng+no+na+nv
+       do j=ng+no+1,ng+no+na
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(ax,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo 
+    call intblock_free(a)
+    call intblock_free(ax)
+    
+    !VV (vv|oo) (vo|vo)
+    call get_twoint(a,'vvoo',o_info, int_info, prog_info%id_cpu)
+    call get_twoint(ax,'vovo',o_info, int_info, prog_info%id_cpu)
+    do i=ng+no+na+1,ng+no+na+nv
+       do j=i,ng+no+na+nv
+          do p = ng+1,ng+no
+             fock(i,j) = fock(i,j) + 2*ijkl(a,i,j,p,p) - ijkl(ax,i,p,j,p)
+          enddo
+          fock(j,i) = fock(i,j)
+       enddo
+    enddo 
+    call intblock_free(a)
+    call intblock_free(ax)
+
+    if ((prog_info%id_cpu .eq. 0) .and. (prog_info%iprint .gt. 1)) then
+       do i=ng+1,ng+no+na+nv
+          do j=i,ng+no+na+nv
+             write(f_fock,*) i,j,fock(i,j)
+          enddo
+       enddo
+    endif
+  end subroutine build_fock
+
+  !$====================================================================
+  !> @brief Diagonalise the Fock matrix
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$====================================================================
+  subroutine diag_fock(fock, o_info)
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in) :: o_info
+
+    logical :: debug = .false.
+    integer :: n, lwork, info,i
+    real(kd_dble), allocatable :: a(:,:)
+    real(kd_dble), allocatable :: wr(:), work(:)
+    
+    n=o_info%ntot
+    lwork = 3*n
+    allocate(a(n,n))
+    allocate(wr(n))
+    allocate(work(lwork))
+    a(:,:) = fock(:,:)
+     
+    call dsyev ('N', 'U', n, a, n, wr, work, lwork, info)
+    if (debug) then
+       write(f_output,*) 'Eigenvalues of the Fock Matrix'
+       do i = 1,n 
+          write(f_output,*) i, wr(i)
+       enddo
+    endif
+    
+    deallocate(a)
+    deallocate(wr)
+    deallocate(work)
+    
+  end subroutine diag_fock
+
+  !$====================================================================
+  !> @brief Compute E0
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$====================================================================
+  subroutine get_e0(ener_info, hcoeur, o_info, int_info, prog_info)
+    
+    type(ener_infotype), intent(inout) :: ener_info
+    real(kd_dble), dimension(:,:), allocatable, intent(in) :: hcoeur
+    type(o_infotype), intent(in) :: o_info
+    type(int_infotype), intent(in) :: int_info
+    type(prog_infotype), intent(in) :: prog_info
+
+    integer :: no, i, j, ng
+    type(intblock) :: a
+    real(kd_dble) :: e1,e2
+
+    e1 = 0.d0
+    e2 = 0.d0
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    call get_twoint(a,'oooo',o_info, int_info, prog_info%id_cpu)
+
+    do i = ng+1, ng+no
+       e1 = e1 + 2*hcoeur(i,i)
+    enddo 
+    
+    do i = ng+1,ng+no
+       do j = ng+1,ng+no        
+             e2 = e2 + 2*ijkl(a,i,i,j,j) - ijkl(a,i,j,i,j)
+       enddo
+    enddo
+    
+    ener_info%Ecoeur = e1+e2
+
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,*) ' One-electron energy = ',e1
+       write(f_output,*) ' Two-electron energy = ',e2
+       write(f_output,*) ' E0                  = ',ener_info%Ecoeur
+       write(f_output,*) ' Pot. Nuc.           = ',ener_info%potnuc
+       write(f_output,*) ' Total E             = ',&
+            ener_info%potnuc + ener_info%Ecoeur
+    endif
+    call intblock_free(a)
+    
+  end subroutine get_e0
+
+  
+end module fockmatrix
diff --git a/src/gencode/aaaa_000_000_generated.F90 b/src/gencode/aaaa_000_000_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..21a8182805739571f2a4697f8f8634c66d02e59f
--- /dev/null
+++ b/src/gencode/aaaa_000_000_generated.F90
@@ -0,0 +1,202 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_000_000_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_000_000( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE( idetactJ, detactJ, idetactI, detactI), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ), &
+    !$OMP& FIRSTPRIVATE(isftI, ndetactI)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,diffI(1),diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(spindiffI(1),spinandIJ(k))*&
+                    ijkl2(twoint,diffI(1),andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_000_000
+
+end module aaaa_000_000_gen
diff --git a/src/gencode/aaaa_generated.F90 b/src/gencode/aaaa_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c0c0d8b653474bdb9641ca20e65baeedc1c3aaae
--- /dev/null
+++ b/src/gencode/aaaa_generated.F90
@@ -0,0 +1,61 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use aaaa_000_000_gen
+  use aaaa_p01_p01_gen1
+  use aaaa_p01_p01_gen2
+  use aaaa_p02_p02_gen1
+  use aaaa_p02_p02_gen2
+  use aaaa_p02_p02_gen3
+  use aaaa_p02_p02_gen4
+  use aaaa_p11_p11_gen
+  use aaaa_p12_p12_gen1
+  use aaaa_p12_p12_gen2
+  use aaaa_m11_m11_gen1
+  use aaaa_m11_m11_gen2
+  use aaaa_m12_m12_gen1
+  use aaaa_m12_m12_gen2
+  use aaaa_m12_m12_gen3
+  use aaaa_m12_m12_gen4
+  use aaaa_p20_p20_gen
+  use aaaa_m20_m20_gen1
+  use aaaa_m20_m20_gen2
+  use aaaa_m20_m20_gen3
+  use aaaa_m20_m20_gen4
+end module aaaa_gen
diff --git a/src/gencode/aaaa_m11_m11_generated1.F90 b/src/gencode/aaaa_m11_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..53e7d06a8f486503df810da97336cc80c73fe39d
--- /dev/null
+++ b/src/gencode/aaaa_m11_m11_generated1.F90
@@ -0,0 +1,221 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m11_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m11_m111( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-2))
+                allocate(spinandIJ(nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-2
+                  JK = JK +ijkl2(twoint,diffI(1),diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(spindiffI(1),spinandIJ(k))*&
+                    ijkl2(twoint,diffI(1),andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_m11_m111
+
+end module aaaa_m11_m11_gen1
diff --git a/src/gencode/aaaa_m11_m11_generated2.F90 b/src/gencode/aaaa_m11_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b02532d95dbc4f5ac6c3579cb91cc1723936ad72
--- /dev/null
+++ b/src/gencode/aaaa_m11_m11_generated2.F90
@@ -0,0 +1,219 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m11_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m11_m112( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-2))
+                allocate(spinandIJ(nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-2
+                  JK = JK +ijkl2(twoint,diffI(1),diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(spindiffI(1),spinandIJ(k))*&
+                    ijkl2(twoint,diffI(1),andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_m11_m112
+
+end module aaaa_m11_m11_gen2
diff --git a/src/gencode/aaaa_m12_m12_generated1.F90 b/src/gencode/aaaa_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2ba67880992dc10cec2d0863eef7f9d6af93419d
--- /dev/null
+++ b/src/gencode/aaaa_m12_m12_generated1.F90
@@ -0,0 +1,371 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m12_m121
+
+end module aaaa_m12_m12_gen1
diff --git a/src/gencode/aaaa_m12_m12_generated2.F90 b/src/gencode/aaaa_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..18b7776800980f12fa62cbfb1a36d6e393150558
--- /dev/null
+++ b/src/gencode/aaaa_m12_m12_generated2.F90
@@ -0,0 +1,569 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m12_m122
+
+end module aaaa_m12_m12_gen2
diff --git a/src/gencode/aaaa_m12_m12_generated3.F90 b/src/gencode/aaaa_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..dafe89819d9d5695d54d1b73e9028f08146f5569
--- /dev/null
+++ b/src/gencode/aaaa_m12_m12_generated3.F90
@@ -0,0 +1,569 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m12_m123
+
+end module aaaa_m12_m12_gen3
diff --git a/src/gencode/aaaa_m12_m12_generated4.F90 b/src/gencode/aaaa_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1c40da3f8a51f238afa31b5f80861fec716266d8
--- /dev/null
+++ b/src/gencode/aaaa_m12_m12_generated4.F90
@@ -0,0 +1,368 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m12_m124
+
+end module aaaa_m12_m12_gen4
diff --git a/src/gencode/aaaa_m20_m20_generated1.F90 b/src/gencode/aaaa_m20_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..906a83926854feb811932881eb585ecd30bc84e2
--- /dev/null
+++ b/src/gencode/aaaa_m20_m20_generated1.F90
@@ -0,0 +1,236 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m20_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m20_m201( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m20_m201
+
+end module aaaa_m20_m20_gen1
diff --git a/src/gencode/aaaa_m20_m20_generated2.F90 b/src/gencode/aaaa_m20_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2fd345501e7a8f022466f111a3e9c0b42cf950f7
--- /dev/null
+++ b/src/gencode/aaaa_m20_m20_generated2.F90
@@ -0,0 +1,327 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m20_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m20_m202( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m20_m202
+
+end module aaaa_m20_m20_gen2
diff --git a/src/gencode/aaaa_m20_m20_generated3.F90 b/src/gencode/aaaa_m20_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d4c5fb87da98b4285c16fa933cb0d53b20d686d1
--- /dev/null
+++ b/src/gencode/aaaa_m20_m20_generated3.F90
@@ -0,0 +1,327 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m20_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m20_m203( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m20_m203
+
+end module aaaa_m20_m20_gen3
diff --git a/src/gencode/aaaa_m20_m20_generated4.F90 b/src/gencode/aaaa_m20_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ceb4613ccd31da017a6d09507de955ab8e7fae99
--- /dev/null
+++ b/src/gencode/aaaa_m20_m20_generated4.F90
@@ -0,0 +1,234 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_m20_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_m20_m204( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-3))
+                allocate(spinandIJ(Nelact-3))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-3
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_m20_m204
+
+end module aaaa_m20_m20_gen4
diff --git a/src/gencode/aaaa_p01_p01_generated1.F90 b/src/gencode/aaaa_p01_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2b909b28dfa2e26ba6fb428711f836955cf3086b
--- /dev/null
+++ b/src/gencode/aaaa_p01_p01_generated1.F90
@@ -0,0 +1,346 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p01_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p01_p011( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p01_p011
+
+end module aaaa_p01_p01_gen1
diff --git a/src/gencode/aaaa_p01_p01_generated2.F90 b/src/gencode/aaaa_p01_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..817412df31a62ee56fd46e38e6a5c50e82afe702
--- /dev/null
+++ b/src/gencode/aaaa_p01_p01_generated2.F90
@@ -0,0 +1,344 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p01_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p01_p012( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p01_p012
+
+end module aaaa_p01_p01_gen2
diff --git a/src/gencode/aaaa_p02_p02_generated1.F90 b/src/gencode/aaaa_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fef3e9e468733fc52290ddd7cf48921e1745442f
--- /dev/null
+++ b/src/gencode/aaaa_p02_p02_generated1.F90
@@ -0,0 +1,832 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_p02_p021
+
+end module aaaa_p02_p02_gen1
diff --git a/src/gencode/aaaa_p02_p02_generated2.F90 b/src/gencode/aaaa_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9e0fbbe5f44be0b9ed8e7e2cdbd15a6b5acefed8
--- /dev/null
+++ b/src/gencode/aaaa_p02_p02_generated2.F90
@@ -0,0 +1,1437 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_p02_p022
+
+end module aaaa_p02_p02_gen2
diff --git a/src/gencode/aaaa_p02_p02_generated3.F90 b/src/gencode/aaaa_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8b9332669b0337ca22c48e2d14d3151461079ddc
--- /dev/null
+++ b/src/gencode/aaaa_p02_p02_generated3.F90
@@ -0,0 +1,1437 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_p02_p023
+
+end module aaaa_p02_p02_gen3
diff --git a/src/gencode/aaaa_p02_p02_generated4.F90 b/src/gencode/aaaa_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..932f0ced93ab7e58d09b99c7e2738a41addaa683
--- /dev/null
+++ b/src/gencode/aaaa_p02_p02_generated4.F90
@@ -0,0 +1,827 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaaa_p02_p024
+
+end module aaaa_p02_p02_gen4
diff --git a/src/gencode/aaaa_p11_p11_generated.F90 b/src/gencode/aaaa_p11_p11_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ba09cbbdcc49683926568946872795f9901501e7
--- /dev/null
+++ b/src/gencode/aaaa_p11_p11_generated.F90
@@ -0,0 +1,323 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p11_p11_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p11_p11( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,diffI(1),diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(spindiffI(1),spinandIJ(k))*&
+                    ijkl2(twoint,diffI(1),andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,diffI(1),diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(spindiffI(1),spinandIJ(k))*&
+                    ijkl2(twoint,diffI(1),andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p11_p11
+
+end module aaaa_p11_p11_gen
diff --git a/src/gencode/aaaa_p12_p12_generated1.F90 b/src/gencode/aaaa_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..dbbf37902bd4dbafbaa8ce3787cac07cb0ef41b6
--- /dev/null
+++ b/src/gencode/aaaa_p12_p12_generated1.F90
@@ -0,0 +1,783 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p12_p121
+
+end module aaaa_p12_p12_gen1
diff --git a/src/gencode/aaaa_p12_p12_generated2.F90 b/src/gencode/aaaa_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7010b3376b7fcae9c1c0fc7f1c40d0b3cf5b83d2
--- /dev/null
+++ b/src/gencode/aaaa_p12_p12_generated2.F90
@@ -0,0 +1,781 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p12_p122
+
+end module aaaa_p12_p12_gen2
diff --git a/src/gencode/aaaa_p20_p20_generated.F90 b/src/gencode/aaaa_p20_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..706680f5b87840a002043d472be298f0b2e17d7d
--- /dev/null
+++ b/src/gencode/aaaa_p20_p20_generated.F90
@@ -0,0 +1,754 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaaa_p20_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaaa_p20_p20( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),diffI(1),diffJ(1))&
+                    -delta(spinandIJ(k),spindiffJ(1))*&
+                    ijkl2(twoint,andIJ(k),diffJ(1),andIJ(k),diffI(1))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +ijkl2(twoint,diffI(1),diffJ(1),diffI(2),diffJ(2))&
+                  -delta(spindiffI(1),spindiffJ(2))*&
+                    ijkl2(twoint,diffI(1),diffJ(2),diffJ(1),diffI(2))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaaa_p20_p20
+
+end module aaaa_p20_p20_gen
diff --git a/src/gencode/aaao_000_p11_generated.F90 b/src/gencode/aaao_000_p11_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ef843a6aabfbf3ac30b25bf430825fc2c6b72292
--- /dev/null
+++ b/src/gencode/aaao_000_p11_generated.F90
@@ -0,0 +1,300 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_000_p11_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_000_p11( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE( idetactJ, detactJ, idetactI, detactI), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ), &
+    !$OMP& FIRSTPRIVATE(isftI, ndetactI)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_000_p11
+
+end module aaao_000_p11_gen
diff --git a/src/gencode/aaao_generated.F90 b/src/gencode/aaao_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9d46c4f9c4315f5fb831a1290aa3f087e22b5ffa
--- /dev/null
+++ b/src/gencode/aaao_generated.F90
@@ -0,0 +1,54 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use aaao_000_p11_gen
+  use aaao_p01_p12_gen1
+  use aaao_p01_p12_gen2
+  use aaao_p01_m11_gen1
+  use aaao_p01_m11_gen2
+  use aaao_p02_m12_gen1
+  use aaao_p02_m12_gen2
+  use aaao_p02_m12_gen3
+  use aaao_p02_m12_gen4
+  use aaao_p11_p20_gen
+  use aaao_m12_m20_gen1
+  use aaao_m12_m20_gen2
+  use aaao_m12_m20_gen3
+  use aaao_m12_m20_gen4
+end module aaao_gen
diff --git a/src/gencode/aaao_m12_m20_generated1.F90 b/src/gencode/aaao_m12_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ff32feade8b109cca219a8f882d2cd81454fecb1
--- /dev/null
+++ b/src/gencode/aaao_m12_m20_generated1.F90
@@ -0,0 +1,363 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_m12_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_m12_m201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_m12_m201
+
+end module aaao_m12_m20_gen1
diff --git a/src/gencode/aaao_m12_m20_generated2.F90 b/src/gencode/aaao_m12_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c8ddaa354f8d1de2ab0f4f861c459bd9864d0bcd
--- /dev/null
+++ b/src/gencode/aaao_m12_m20_generated2.F90
@@ -0,0 +1,555 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_m12_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_m12_m202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_m12_m202
+
+end module aaao_m12_m20_gen2
diff --git a/src/gencode/aaao_m12_m20_generated3.F90 b/src/gencode/aaao_m12_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3ab82dcd30eea699b5a9a2f2938558ae667dfdf8
--- /dev/null
+++ b/src/gencode/aaao_m12_m20_generated3.F90
@@ -0,0 +1,555 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_m12_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_m12_m203( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_m12_m203
+
+end module aaao_m12_m20_gen3
diff --git a/src/gencode/aaao_m12_m20_generated4.F90 b/src/gencode/aaao_m12_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3329cffae2cc7f81921d13fdbfe3f75298fd98ff
--- /dev/null
+++ b/src/gencode/aaao_m12_m20_generated4.F90
@@ -0,0 +1,360 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_m12_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_m12_m204( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_m12_m204
+
+end module aaao_m12_m20_gen4
diff --git a/src/gencode/aaao_p01_m11_generated1.F90 b/src/gencode/aaao_p01_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d88669e79fbea1df550f8cd4dfdcfb9831105f57
--- /dev/null
+++ b/src/gencode/aaao_p01_m11_generated1.F90
@@ -0,0 +1,336 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p01_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p01_m111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),spindiffI(1))*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK -delta(spindiffI(1),1)*&
+                  ijkl1(twoint,diffJ(1),diffI(2),diffI(1),t1      )&
+                  +delta(spindiffJ(1),spindiffI(1))*&
+                    ijkl1(twoint,diffJ(1),diffI(1),diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),spindiffI(1))*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK -delta(spindiffI(1),-1)*&
+                  ijkl1(twoint,diffJ(1),diffI(2),diffI(1),t1      )&
+                  +delta(spindiffJ(1),spindiffI(1))*&
+                    ijkl1(twoint,diffJ(1),diffI(1),diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_p01_m111
+
+end module aaao_p01_m11_gen1
diff --git a/src/gencode/aaao_p01_m11_generated2.F90 b/src/gencode/aaao_p01_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d9fd70e0452fdfb751af9774032c25ee941d0713
--- /dev/null
+++ b/src/gencode/aaao_p01_m11_generated2.F90
@@ -0,0 +1,334 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p01_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p01_m112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),spindiffI(1))*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK -delta(spindiffI(1),1)*&
+                  ijkl1(twoint,diffJ(1),diffI(2),diffI(1),t1      )&
+                  +delta(spindiffJ(1),spindiffI(1))*&
+                    ijkl1(twoint,diffJ(1),diffI(1),diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),spindiffI(1))*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK -delta(spindiffI(1),-1)*&
+                  ijkl1(twoint,diffJ(1),diffI(2),diffI(1),t1      )&
+                  +delta(spindiffJ(1),spindiffI(1))*&
+                    ijkl1(twoint,diffJ(1),diffI(1),diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_p01_m112
+
+end module aaao_p01_m11_gen2
diff --git a/src/gencode/aaao_p01_p12_generated1.F90 b/src/gencode/aaao_p01_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..652dfec447873e25be27fc9e1519e12bed0ea214
--- /dev/null
+++ b/src/gencode/aaao_p01_p12_generated1.F90
@@ -0,0 +1,903 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p01_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p01_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_p01_p121
+
+end module aaao_p01_p12_gen1
diff --git a/src/gencode/aaao_p01_p12_generated2.F90 b/src/gencode/aaao_p01_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2369909d7b866c70db7f834053efef3affb378c2
--- /dev/null
+++ b/src/gencode/aaao_p01_p12_generated2.F90
@@ -0,0 +1,901 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p01_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p01_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_p01_p122
+
+end module aaao_p01_p12_gen2
diff --git a/src/gencode/aaao_p02_m12_generated1.F90 b/src/gencode/aaao_p02_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a0686d2603a11d8b8864a1f75f67c7ec91c13c0d
--- /dev/null
+++ b/src/gencode/aaao_p02_m12_generated1.F90
@@ -0,0 +1,975 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p02_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p02_m121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_p02_m121
+
+end module aaao_p02_m12_gen1
diff --git a/src/gencode/aaao_p02_m12_generated2.F90 b/src/gencode/aaao_p02_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c7ff385e4404825143bfc04711583c544853e331
--- /dev/null
+++ b/src/gencode/aaao_p02_m12_generated2.F90
@@ -0,0 +1,1723 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p02_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p02_m122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_p02_m122
+
+end module aaao_p02_m12_gen2
diff --git a/src/gencode/aaao_p02_m12_generated3.F90 b/src/gencode/aaao_p02_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6ccc0ed41311874c2abfcad296d8954fb3668ada
--- /dev/null
+++ b/src/gencode/aaao_p02_m12_generated3.F90
@@ -0,0 +1,1723 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p02_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p02_m123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_p02_m123
+
+end module aaao_p02_m12_gen3
diff --git a/src/gencode/aaao_p02_m12_generated4.F90 b/src/gencode/aaao_p02_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d1aee1a829b2bb6a2976aee0f966114210fc3759
--- /dev/null
+++ b/src/gencode/aaao_p02_m12_generated4.F90
@@ -0,0 +1,970 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p02_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p02_m124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffI(1),t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffI(1),andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl1(twoint,diffI(2),diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaao_p02_m124
+
+end module aaao_p02_m12_gen4
diff --git a/src/gencode/aaao_p11_p20_generated.F90 b/src/gencode/aaao_p11_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1bbbb936ac8bd62f793c923478e5f81bd8d22406
--- /dev/null
+++ b/src/gencode/aaao_p11_p20_generated.F90
@@ -0,0 +1,880 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaao_p11_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaao_p11_p20( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t4      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t4      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl1(twoint,andIJ(k),andIJ(k),diffJ(1),t3      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl1(twoint,andIJ(k),diffJ(1),andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(2),-1)*&
+                  ijkl1(twoint,diffI(1),diffJ(1),diffJ(2),t3      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl1(twoint,diffI(1),diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaao_p11_p20
+
+end module aaao_p11_p20_gen
diff --git a/src/gencode/aaoo_generated.F90 b/src/gencode/aaoo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..edc0f2e0d3da41551964b41b1dcca6f8158f1e99
--- /dev/null
+++ b/src/gencode/aaoo_generated.F90
@@ -0,0 +1,54 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use aaoo_p01_p01_gen1
+  use aaoo_p01_p01_gen2
+  use aaoo_p02_p02_gen1
+  use aaoo_p02_p02_gen2
+  use aaoo_p02_p02_gen3
+  use aaoo_p02_p02_gen4
+  use aaoo_p11_p11_gen
+  use aaoo_p12_p12_gen1
+  use aaoo_p12_p12_gen2
+  use aaoo_m12_m12_gen1
+  use aaoo_m12_m12_gen2
+  use aaoo_m12_m12_gen3
+  use aaoo_m12_m12_gen4
+  use aaoo_p20_p20_gen
+end module aaoo_gen
diff --git a/src/gencode/aaoo_m12_m12_generated1.F90 b/src/gencode/aaoo_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8ef0b26469591ddc83b04d2e85019595150e7c3f
--- /dev/null
+++ b/src/gencode/aaoo_m12_m12_generated1.F90
@@ -0,0 +1,492 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_m12_m121
+
+end module aaoo_m12_m12_gen1
diff --git a/src/gencode/aaoo_m12_m12_generated2.F90 b/src/gencode/aaoo_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..49c9d9349325a08b8116c09aeb89ef502397e872
--- /dev/null
+++ b/src/gencode/aaoo_m12_m12_generated2.F90
@@ -0,0 +1,811 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_m12_m122
+
+end module aaoo_m12_m12_gen2
diff --git a/src/gencode/aaoo_m12_m12_generated3.F90 b/src/gencode/aaoo_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ca61d18d786129626548c6720ed84fa27bbeb311
--- /dev/null
+++ b/src/gencode/aaoo_m12_m12_generated3.F90
@@ -0,0 +1,811 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_m12_m123
+
+end module aaoo_m12_m12_gen3
diff --git a/src/gencode/aaoo_m12_m12_generated4.F90 b/src/gencode/aaoo_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a3910b01022e47b5742de977bb4a856353009261
--- /dev/null
+++ b/src/gencode/aaoo_m12_m12_generated4.F90
@@ -0,0 +1,489 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_m12_m124
+
+end module aaoo_m12_m12_gen4
diff --git a/src/gencode/aaoo_p01_p01_generated1.F90 b/src/gencode/aaoo_p01_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b2a9311d4b189a4e7e2da0baaea1986e0e5382ee
--- /dev/null
+++ b/src/gencode/aaoo_p01_p01_generated1.F90
@@ -0,0 +1,465 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p01_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p01_p011( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p01_p011
+
+end module aaoo_p01_p01_gen1
diff --git a/src/gencode/aaoo_p01_p01_generated2.F90 b/src/gencode/aaoo_p01_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..850d4a28237d81baf89ddd2c3e03e1aafd3356ad
--- /dev/null
+++ b/src/gencode/aaoo_p01_p01_generated2.F90
@@ -0,0 +1,463 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p01_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p01_p012( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p01_p012
+
+end module aaoo_p01_p01_gen2
diff --git a/src/gencode/aaoo_p02_p02_generated1.F90 b/src/gencode/aaoo_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9087a8798212a29b1eb8e8c0478dda70ca509939
--- /dev/null
+++ b/src/gencode/aaoo_p02_p02_generated1.F90
@@ -0,0 +1,2398 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_p02_p021
+
+end module aaoo_p02_p02_gen1
diff --git a/src/gencode/aaoo_p02_p02_generated2.F90 b/src/gencode/aaoo_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..10795eda3a90f66fb3ed000ebfaaef261f766b18
--- /dev/null
+++ b/src/gencode/aaoo_p02_p02_generated2.F90
@@ -0,0 +1,4569 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_p02_p022
+
+end module aaoo_p02_p02_gen2
diff --git a/src/gencode/aaoo_p02_p02_generated3.F90 b/src/gencode/aaoo_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..19c39afc101b35b2efa1fcd782f68d83b6a059d2
--- /dev/null
+++ b/src/gencode/aaoo_p02_p02_generated3.F90
@@ -0,0 +1,4569 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_p02_p023
+
+end module aaoo_p02_p02_gen3
diff --git a/src/gencode/aaoo_p02_p02_generated4.F90 b/src/gencode/aaoo_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6e2141b0b1c0a371a128166ea6285b39e5f1bdb2
--- /dev/null
+++ b/src/gencode/aaoo_p02_p02_generated4.F90
@@ -0,0 +1,2393 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aaoo_p02_p024
+
+end module aaoo_p02_p02_gen4
diff --git a/src/gencode/aaoo_p11_p11_generated.F90 b/src/gencode/aaoo_p11_p11_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3559d36a9fe412df1c51877c5dfa6ce4d8788cc7
--- /dev/null
+++ b/src/gencode/aaoo_p11_p11_generated.F90
@@ -0,0 +1,444 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p11_p11_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p11_p11( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact+1))
+                allocate(spinandIJ(nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*delta(spindiffJ(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*delta(spindiffJ(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact+1))
+                allocate(spinandIJ(nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(spindiffI(1),spindiffJ(1))*&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*delta(spindiffJ(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p11_p11
+
+end module aaoo_p11_p11_gen
diff --git a/src/gencode/aaoo_p12_p12_generated1.F90 b/src/gencode/aaoo_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8f517c20f86dba2662049f99ae9cb6d6d8db66dd
--- /dev/null
+++ b/src/gencode/aaoo_p12_p12_generated1.F90
@@ -0,0 +1,2349 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p12_p121
+
+end module aaoo_p12_p12_gen1
diff --git a/src/gencode/aaoo_p12_p12_generated2.F90 b/src/gencode/aaoo_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..347bc6c48331fd8079f257f0e1269724f637571a
--- /dev/null
+++ b/src/gencode/aaoo_p12_p12_generated2.F90
@@ -0,0 +1,2347 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t4      ,andIJ(k),t2      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t3      ,andIJ(k),t1      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p12_p122
+
+end module aaoo_p12_p12_gen2
diff --git a/src/gencode/aaoo_p20_p20_generated.F90 b/src/gencode/aaoo_p20_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..96f43ad40213af0bed314afdc8f0caa38628370d
--- /dev/null
+++ b/src/gencode/aaoo_p20_p20_generated.F90
@@ -0,0 +1,2320 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aaoo_p20_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aaoo_p20_p20( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t4      ,t2      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t2      ,andIJ(k),t4      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t4      ,t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+2))
+                allocate(spinandIJ(Nelact+2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+2
+                  JK = JK +ijkl2(twoint,andIJ(k),andIJ(k),t3      ,t1      )&
+                    -delta(spinandIJ(k),-1)*&
+                    ijkl2(twointx,andIJ(k),t1      ,andIJ(k),t3      )
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),diffJ(1),t3      ,t1      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t1      ,t1      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,diffI(1),diffJ(1),t2      ,t2      )&
+                  +delta(spindiffI(1),-1)*&
+                    ijkl2(twointx,diffI(1),t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aaoo_p20_p20
+
+end module aaoo_p20_p20_gen
diff --git a/src/gencode/aoao_000_p20_generated.F90 b/src/gencode/aoao_000_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..daaa3431cd7038847a906680671e88b4d46f3c0d
--- /dev/null
+++ b/src/gencode/aoao_000_p20_generated.F90
@@ -0,0 +1,340 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_000_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_000_p20( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE( idetactJ, detactJ, idetactI, detactI), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ), &
+    !$OMP& FIRSTPRIVATE(isftI, ndetactI)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !00UU
+            ! t4 < t3
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+            !spint4 = 1
+            !t4 in occU+ligoU
+              do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoU
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(3), &
+                   0                 ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(1),1)*&
+                  ijkl2(twoint,diffJ(1),t3      ,diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl2(twoint,diffJ(1),t4      ,diffJ(2),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              enddo !t3
+            enddo !t4
+            !00DU
+            ! t4 < t3
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+            !spint4 = 1
+            !t4 in occU+ligoU
+              do t3 = isfth+nocc+1, isfth+nocc+nligo
+              !t3 in ligoD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(3), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(1),-1)*&
+                  ijkl2(twoint,diffJ(1),t3      ,diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl2(twoint,diffJ(1),t4      ,diffJ(2),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth + nocc + 1, isfth+nocc+nligo
+            !t4 in ligoU
+            do t3 = isfth+1, isfth+nocc !t3 in occD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(3), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(1),-1)*&
+                  ijkl2(twoint,diffJ(1),t3      ,diffJ(2),t4      )&
+                  -delta(spindiffJ(1),1)*&
+                    ijkl2(twoint,diffJ(1),t4      ,diffJ(2),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !00DD
+            ! t4 < t3
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+            !spint4 = -1
+            !t4 in occD+ligoD
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(3), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffJ(1),-1)*&
+                  ijkl2(twoint,diffJ(1),t3      ,diffJ(2),t4      )&
+                  -delta(spindiffJ(1),-1)*&
+                    ijkl2(twoint,diffJ(1),t4      ,diffJ(2),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+        enddo !i
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aoao_000_p20
+
+end module aoao_000_p20_gen
diff --git a/src/gencode/aoao_generated.F90 b/src/gencode/aoao_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..41c8e3f849939a65cd921bbe2cce2fb94d3d3d66
--- /dev/null
+++ b/src/gencode/aoao_generated.F90
@@ -0,0 +1,47 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use aoao_000_p20_gen
+  use aoao_p02_m20_gen1
+  use aoao_p02_m20_gen2
+  use aoao_p02_m20_gen3
+  use aoao_p02_m20_gen4
+  use aoao_p12_m11_gen1
+  use aoao_p12_m11_gen2
+end module aoao_gen
diff --git a/src/gencode/aoao_p02_m20_generated1.F90 b/src/gencode/aoao_p02_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c6fb322e17a8c2ce721e57abba0e43e3fcb99e30
--- /dev/null
+++ b/src/gencode/aoao_p02_m20_generated1.F90
@@ -0,0 +1,453 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p02_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p02_m201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aoao_p02_m201
+
+end module aoao_p02_m20_gen1
diff --git a/src/gencode/aoao_p02_m20_generated2.F90 b/src/gencode/aoao_p02_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..22f412c40a5a9dff86a2d098b8ae50f79b01bca2
--- /dev/null
+++ b/src/gencode/aoao_p02_m20_generated2.F90
@@ -0,0 +1,681 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p02_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p02_m202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aoao_p02_m202
+
+end module aoao_p02_m20_gen2
diff --git a/src/gencode/aoao_p02_m20_generated3.F90 b/src/gencode/aoao_p02_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2fd37c0f0aee694db973a0ebb4376941cd37fe16
--- /dev/null
+++ b/src/gencode/aoao_p02_m20_generated3.F90
@@ -0,0 +1,681 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p02_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p02_m203( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aoao_p02_m203
+
+end module aoao_p02_m20_gen3
diff --git a/src/gencode/aoao_p02_m20_generated4.F90 b/src/gencode/aoao_p02_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fbed15f13fffa0887ac053f9bacea106f56e1794
--- /dev/null
+++ b/src/gencode/aoao_p02_m20_generated4.F90
@@ -0,0 +1,448 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p02_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p02_m204( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aoao_p02_m204
+
+end module aoao_p02_m20_gen4
diff --git a/src/gencode/aoao_p12_m11_generated1.F90 b/src/gencode/aoao_p12_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9518262e5fada079837ef85513010ad66f347e99
--- /dev/null
+++ b/src/gencode/aoao_p12_m11_generated1.F90
@@ -0,0 +1,404 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p12_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p12_m111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aoao_p12_m111
+
+end module aoao_p12_m11_gen1
diff --git a/src/gencode/aoao_p12_m11_generated2.F90 b/src/gencode/aoao_p12_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b72b1cea8578b06773975ad7245b895678e18ea2
--- /dev/null
+++ b/src/gencode/aoao_p12_m11_generated2.F90
@@ -0,0 +1,402 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aoao_p12_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aoao_p12_m112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(spindiffI(1),-1)*&
+                  ijkl2(twoint,diffI(1),t1      ,diffI(2),t2      )&
+                  -delta(spindiffI(1),-1)*&
+                    ijkl2(twoint,diffI(1),t2      ,diffI(2),t1      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aoao_p12_m112
+
+end module aoao_p12_m11_gen2
diff --git a/src/gencode/aooo_generated.F90 b/src/gencode/aooo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cdbb5d3da78430c4ee5c18f0e853989d23d01363
--- /dev/null
+++ b/src/gencode/aooo_generated.F90
@@ -0,0 +1,47 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use aooo_p01_p12_gen1
+  use aooo_p01_p12_gen2
+  use aooo_p02_m12_gen1
+  use aooo_p02_m12_gen2
+  use aooo_p02_m12_gen3
+  use aooo_p02_m12_gen4
+  use aooo_p11_p20_gen
+end module aooo_gen
diff --git a/src/gencode/aooo_p01_p12_generated1.F90 b/src/gencode/aooo_p01_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d6e51fea18f0e254c06ce3aa82530c068a1d1919
--- /dev/null
+++ b/src/gencode/aooo_p01_p12_generated1.F90
@@ -0,0 +1,1341 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p01_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p01_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            do t4 = isfth+nocc+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DD
+            !spint3 = -1
+            !spint4 = -1
+            ! t1 < t4 < t3
+            do t4 = isfth+1, isfth+nocc+nligo
+            !t4 in occD+ligoD
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0UU
+            !spint3 = 1
+            !spint4 = 1
+            ! t4 < t3 < t1
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !t4 in occU+ligoU
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoU
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            ! t4 < t3 < t1
+            do t3 = isfth+1, min(t1-1, isfth+nocc)
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            ! t4 < t1 < t3
+            do t3 = t1 + 1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aooo_p01_p121
+
+end module aooo_p01_p12_gen1
diff --git a/src/gencode/aooo_p01_p12_generated2.F90 b/src/gencode/aooo_p01_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4c30361e3d92f5f9c31818ce63a813f8d371d42e
--- /dev/null
+++ b/src/gencode/aooo_p01_p12_generated2.F90
@@ -0,0 +1,1339 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p01_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p01_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            do t4 = isfth+nocc+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DD
+            !spint3 = -1
+            !spint4 = -1
+            ! t1 < t4 < t3
+            do t4 = isfth+1, isfth+nocc+nligo
+            !t4 in occD+ligoD
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0UU
+            !spint3 = 1
+            !spint4 = 1
+            ! t4 < t3 < t1
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !t4 in occU+ligoU
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoU
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            ! t4 < t3 < t1
+            do t3 = isfth+1, min(t1-1, isfth+nocc)
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            ! t4 < t1 < t3
+            do t3 = t1 + 1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aooo_p01_p122
+
+end module aooo_p01_p12_gen2
diff --git a/src/gencode/aooo_p02_m12_generated1.F90 b/src/gencode/aooo_p02_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a9ecfcd26531cca967548fcf709c25b37ca264ef
--- /dev/null
+++ b/src/gencode/aooo_p02_m12_generated1.F90
@@ -0,0 +1,1364 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p02_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p02_m121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aooo_p02_m121
+
+end module aooo_p02_m12_gen1
diff --git a/src/gencode/aooo_p02_m12_generated2.F90 b/src/gencode/aooo_p02_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6209a364370b617161aa99cbd34f2aab4f10418b
--- /dev/null
+++ b/src/gencode/aooo_p02_m12_generated2.F90
@@ -0,0 +1,2501 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p02_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p02_m122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aooo_p02_m122
+
+end module aooo_p02_m12_gen2
diff --git a/src/gencode/aooo_p02_m12_generated3.F90 b/src/gencode/aooo_p02_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2537510d337dd7073bcf1589884058d27a6899dd
--- /dev/null
+++ b/src/gencode/aooo_p02_m12_generated3.F90
@@ -0,0 +1,2501 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p02_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p02_m123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aooo_p02_m123
+
+end module aooo_p02_m12_gen3
diff --git a/src/gencode/aooo_p02_m12_generated4.F90 b/src/gencode/aooo_p02_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..64465a0c2612f12ae2f67d166e7fdc278fd16a62
--- /dev/null
+++ b/src/gencode/aooo_p02_m12_generated4.F90
@@ -0,0 +1,1359 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p02_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p02_m124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !t2 < t1 < t3
+            do t3 = isfth+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffI(1),t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffI(1),t1      ,t2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffI(1),t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,diffI(1),t2      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_aooo_p02_m124
+
+end module aooo_p02_m12_gen4
diff --git a/src/gencode/aooo_p11_p20_generated.F90 b/src/gencode/aooo_p11_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..70bd7fc544db7cb1e7e7e570735a416d1e256f06
--- /dev/null
+++ b/src/gencode/aooo_p11_p20_generated.F90
@@ -0,0 +1,1318 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module aooo_p11_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_aooo_p11_p20( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            do t4 = isfth+nocc+1, t1-1
+            ! t4 < t1 < t3
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !U0DD
+            !spint3 = -1
+            !spint4 = -1
+            ! t1 < t4 < t3
+            do t4 = isfth+1, isfth+nocc+nligo
+            !t4 in occD+ligoD
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoD
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !D0UU
+            !spint3 = 1
+            !spint4 = 1
+            ! t4 < t3 < t1
+            do t4 = isfth + 1, isfth+nocc+nligo
+            !t4 in occU+ligoU
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+            !t3 in ligoU
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            ! t4 < t3 < t1
+            do t3 = isfth+1, min(t1-1, isfth+nocc)
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            ! t4 < t1 < t3
+            do t3 = t1 + 1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            ! t4 < t3 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(6), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t4      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            ! t4 < t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(8), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,diffJ(1),t3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,diffJ(1),t1      ,t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            ! t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(12), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,diffJ(1),t3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twoint,diffJ(1),t4      ,t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            enddo !t4
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_aooo_p11_p20
+
+end module aooo_p11_p20_gen
diff --git a/src/gencode/fock_000_000_generated.F90 b/src/gencode/fock_000_000_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c5beab66fb83f94261ccc9e8a53a2cf623645c74
--- /dev/null
+++ b/src/gencode/fock_000_000_generated.F90
@@ -0,0 +1,158 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_000_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_000( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE( idetactJ, detactJ, idetactI, detactI), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ), &
+    !$OMP& FIRSTPRIVATE(isftI, ndetactI)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_000
+
+end module fock_000_000_gen
diff --git a/src/gencode/fock_000_m11_generated1.F90 b/src/gencode/fock_000_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c2f6927383a47d7bdb5143c675306c1bd56998d4
--- /dev/null
+++ b/src/gencode/fock_000_m11_generated1.F90
@@ -0,0 +1,172 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_m111( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_m111
+
+end module fock_000_m11_gen1
diff --git a/src/gencode/fock_000_m11_generated2.F90 b/src/gencode/fock_000_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0b4206271733220c733996cc92ef3ee479e7fe8e
--- /dev/null
+++ b/src/gencode/fock_000_m11_generated2.F90
@@ -0,0 +1,170 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_m112( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_m112
+
+end module fock_000_m11_gen2
diff --git a/src/gencode/fock_000_p01_generated1.F90 b/src/gencode/fock_000_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..eebf52339c670427d19addbb6b9494c9a5d544a6
--- /dev/null
+++ b/src/gencode/fock_000_p01_generated1.F90
@@ -0,0 +1,187 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_p011( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_p011
+
+end module fock_000_p01_gen1
diff --git a/src/gencode/fock_000_p01_generated2.F90 b/src/gencode/fock_000_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1e2005f458f38a83f243b531b1c1535c7b6ccbf1
--- /dev/null
+++ b/src/gencode/fock_000_p01_generated2.F90
@@ -0,0 +1,185 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_p012( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_p012
+
+end module fock_000_p01_gen2
diff --git a/src/gencode/fock_000_p11_generated.F90 b/src/gencode/fock_000_p11_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9bda42fa39a3f737633471342d9a84ba4bb55941
--- /dev/null
+++ b/src/gencode/fock_000_p11_generated.F90
@@ -0,0 +1,209 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_000_p11_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_000_p11( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE( idetactJ, detactJ, idetactI, detactI), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ), &
+    !$OMP& FIRSTPRIVATE(isftI, ndetactI)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+        enddo !i
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_000_p11
+
+end module fock_000_p11_gen
diff --git a/src/gencode/fock_generated.F90 b/src/gencode/fock_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9fe69e5bddaad3dcae537ed208dda67ed25a7a23
--- /dev/null
+++ b/src/gencode/fock_generated.F90
@@ -0,0 +1,106 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  use fock_000_000_gen
+  use fock_000_p01_gen1
+  use fock_000_p01_gen2
+  use fock_000_p11_gen
+  use fock_000_m11_gen1
+  use fock_000_m11_gen2
+  use fock_p01_p01_gen1
+  use fock_p01_p01_gen2
+  use fock_p01_p02_gen1
+  use fock_p01_p02_gen2
+  use fock_p01_p02_gen3
+  use fock_p01_p02_gen4
+  use fock_p01_p11_gen1
+  use fock_p01_p11_gen2
+  use fock_p01_p12_gen1
+  use fock_p01_p12_gen2
+  use fock_p01_m11_gen1
+  use fock_p01_m11_gen2
+  use fock_p01_m12_gen1
+  use fock_p01_m12_gen2
+  use fock_p01_m12_gen3
+  use fock_p01_m12_gen4
+  use fock_p02_p02_gen1
+  use fock_p02_p02_gen2
+  use fock_p02_p02_gen3
+  use fock_p02_p02_gen4
+  use fock_p02_p12_gen1
+  use fock_p02_p12_gen2
+  use fock_p02_p12_gen3
+  use fock_p02_p12_gen4
+  use fock_p02_m12_gen1
+  use fock_p02_m12_gen2
+  use fock_p02_m12_gen3
+  use fock_p02_m12_gen4
+  use fock_p11_p11_gen
+  use fock_p11_p12_gen1
+  use fock_p11_p12_gen2
+  use fock_p11_p20_gen
+  use fock_p12_p12_gen1
+  use fock_p12_p12_gen2
+  use fock_p12_p20_gen1
+  use fock_p12_p20_gen2
+  use fock_m11_m11_gen1
+  use fock_m11_m11_gen2
+  use fock_m11_m12_gen1
+  use fock_m11_m12_gen2
+  use fock_m11_m12_gen3
+  use fock_m11_m12_gen4
+  use fock_m11_m20_gen1
+  use fock_m11_m20_gen2
+  use fock_m11_m20_gen3
+  use fock_m11_m20_gen4
+  use fock_m12_m12_gen1
+  use fock_m12_m12_gen2
+  use fock_m12_m12_gen3
+  use fock_m12_m12_gen4
+  use fock_m12_m20_gen1
+  use fock_m12_m20_gen2
+  use fock_m12_m20_gen3
+  use fock_m12_m20_gen4
+  use fock_p20_p20_gen
+  use fock_m20_m20_gen1
+  use fock_m20_m20_gen2
+  use fock_m20_m20_gen3
+  use fock_m20_m20_gen4
+end module fock_gen
diff --git a/src/gencode/fock_m11_m11_generated1.F90 b/src/gencode/fock_m11_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d842337997183e3510d9623cf58fdc507aa25425
--- /dev/null
+++ b/src/gencode/fock_m11_m11_generated1.F90
@@ -0,0 +1,206 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m111( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_m11_m111
+
+end module fock_m11_m11_gen1
diff --git a/src/gencode/fock_m11_m11_generated2.F90 b/src/gencode/fock_m11_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0bc24195f196f58890cb0d573db3db37fd014bf5
--- /dev/null
+++ b/src/gencode/fock_m11_m11_generated2.F90
@@ -0,0 +1,208 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m112( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_m11_m112
+
+end module fock_m11_m11_gen2
diff --git a/src/gencode/fock_m11_m12_generated1.F90 b/src/gencode/fock_m11_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d4518ba3013b76fe501984988cc31983a961098c
--- /dev/null
+++ b/src/gencode/fock_m11_m12_generated1.F90
@@ -0,0 +1,238 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m121
+
+end module fock_m11_m12_gen1
diff --git a/src/gencode/fock_m11_m12_generated2.F90 b/src/gencode/fock_m11_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2cd40a1c163028fab1786b30a6e8da19261db0d4
--- /dev/null
+++ b/src/gencode/fock_m11_m12_generated2.F90
@@ -0,0 +1,238 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m122
+
+end module fock_m11_m12_gen2
diff --git a/src/gencode/fock_m11_m12_generated3.F90 b/src/gencode/fock_m11_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8b3ba6262fc326ea962f7f2276618c99dacac655
--- /dev/null
+++ b/src/gencode/fock_m11_m12_generated3.F90
@@ -0,0 +1,238 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m123
+
+end module fock_m11_m12_gen3
diff --git a/src/gencode/fock_m11_m12_generated4.F90 b/src/gencode/fock_m11_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f9497ff42fbfc1469868dfd68157d2d735baeb1c
--- /dev/null
+++ b/src/gencode/fock_m11_m12_generated4.F90
@@ -0,0 +1,237 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m124
+
+end module fock_m11_m12_gen4
diff --git a/src/gencode/fock_m11_m20_generated1.F90 b/src/gencode/fock_m11_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..392a338646987ba4c744e0e05d2c1bd0a0de8843
--- /dev/null
+++ b/src/gencode/fock_m11_m20_generated1.F90
@@ -0,0 +1,224 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m201( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m201
+
+end module fock_m11_m20_gen1
diff --git a/src/gencode/fock_m11_m20_generated2.F90 b/src/gencode/fock_m11_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..dffa73508e0ee580ebb23ec7c126a2ba58739ed6
--- /dev/null
+++ b/src/gencode/fock_m11_m20_generated2.F90
@@ -0,0 +1,224 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m202( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m202
+
+end module fock_m11_m20_gen2
diff --git a/src/gencode/fock_m11_m20_generated3.F90 b/src/gencode/fock_m11_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f264d48b46ef781c351586f556ec60ca48b5444b
--- /dev/null
+++ b/src/gencode/fock_m11_m20_generated3.F90
@@ -0,0 +1,224 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m203( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m203
+
+end module fock_m11_m20_gen3
diff --git a/src/gencode/fock_m11_m20_generated4.F90 b/src/gencode/fock_m11_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bd88f45c0221488b2ab58fd271e8749952791d47
--- /dev/null
+++ b/src/gencode/fock_m11_m20_generated4.F90
@@ -0,0 +1,223 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m11_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m11_m204( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m11_m204
+
+end module fock_m11_m20_gen4
diff --git a/src/gencode/fock_m12_m12_generated1.F90 b/src/gencode/fock_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4be6779708e7253551bc61fff493dba39a5cde77
--- /dev/null
+++ b/src/gencode/fock_m12_m12_generated1.F90
@@ -0,0 +1,579 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m121
+
+end module fock_m12_m12_gen1
diff --git a/src/gencode/fock_m12_m12_generated2.F90 b/src/gencode/fock_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bd9d7053d4eec4269671695c04dcaaf5805220de
--- /dev/null
+++ b/src/gencode/fock_m12_m12_generated2.F90
@@ -0,0 +1,968 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m122
+
+end module fock_m12_m12_gen2
diff --git a/src/gencode/fock_m12_m12_generated3.F90 b/src/gencode/fock_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..52e3fa18957b22aebd3a06e4f4824dc1e1b9e0b7
--- /dev/null
+++ b/src/gencode/fock_m12_m12_generated3.F90
@@ -0,0 +1,968 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m123
+
+end module fock_m12_m12_gen3
diff --git a/src/gencode/fock_m12_m12_generated4.F90 b/src/gencode/fock_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a9a1978532877f5354acd6b5ae2a25dc2299769e
--- /dev/null
+++ b/src/gencode/fock_m12_m12_generated4.F90
@@ -0,0 +1,660 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m124
+
+end module fock_m12_m12_gen4
diff --git a/src/gencode/fock_m12_m20_generated1.F90 b/src/gencode/fock_m12_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..69ab8104a3d6315ad7235e39283c3e32f8d92ede
--- /dev/null
+++ b/src/gencode/fock_m12_m20_generated1.F90
@@ -0,0 +1,406 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m201
+
+end module fock_m12_m20_gen1
diff --git a/src/gencode/fock_m12_m20_generated2.F90 b/src/gencode/fock_m12_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cc2ad7d815283ad4cea3db672d6d98b03ad73f84
--- /dev/null
+++ b/src/gencode/fock_m12_m20_generated2.F90
@@ -0,0 +1,610 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m202
+
+end module fock_m12_m20_gen2
diff --git a/src/gencode/fock_m12_m20_generated3.F90 b/src/gencode/fock_m12_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f15a8efccc3f125e5c78566da7fe43818093d8a1
--- /dev/null
+++ b/src/gencode/fock_m12_m20_generated3.F90
@@ -0,0 +1,610 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m203( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m203
+
+end module fock_m12_m20_gen3
diff --git a/src/gencode/fock_m12_m20_generated4.F90 b/src/gencode/fock_m12_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d6b0748ddd059c804153ea0070a271d0ab9cfa73
--- /dev/null
+++ b/src/gencode/fock_m12_m20_generated4.F90
@@ -0,0 +1,405 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m12_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m12_m204( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m12_m204
+
+end module fock_m12_m20_gen4
diff --git a/src/gencode/fock_m20_m20_generated1.F90 b/src/gencode/fock_m20_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f4ddff7329cd1c0b2b40788201fe1e7717c1176f
--- /dev/null
+++ b/src/gencode/fock_m20_m20_generated1.F90
@@ -0,0 +1,287 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m20_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m20_m201( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m20_m201
+
+end module fock_m20_m20_gen1
diff --git a/src/gencode/fock_m20_m20_generated2.F90 b/src/gencode/fock_m20_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..79cc8315bc9624e5e0ef0a89ea505c2074f8161d
--- /dev/null
+++ b/src/gencode/fock_m20_m20_generated2.F90
@@ -0,0 +1,421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m20_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m20_m202( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m20_m202
+
+end module fock_m20_m20_gen2
diff --git a/src/gencode/fock_m20_m20_generated3.F90 b/src/gencode/fock_m20_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0e8797c52071b0894f5b235035502560c284d2e4
--- /dev/null
+++ b/src/gencode/fock_m20_m20_generated3.F90
@@ -0,0 +1,421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m20_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m20_m203( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m20_m203
+
+end module fock_m20_m20_gen3
diff --git a/src/gencode/fock_m20_m20_generated4.F90 b/src/gencode/fock_m20_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e03f5c192918ba5835bbba65a9af993a5749e3ec
--- /dev/null
+++ b/src/gencode/fock_m20_m20_generated4.F90
@@ -0,0 +1,311 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_m20_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_m20_m204( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_m20_m204
+
+end module fock_m20_m20_gen4
diff --git a/src/gencode/fock_p01_m11_generated1.F90 b/src/gencode/fock_p01_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1148d0621804119d71796d989da58d1481bb25ba
--- /dev/null
+++ b/src/gencode/fock_p01_m11_generated1.F90
@@ -0,0 +1,273 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_m111
+
+end module fock_p01_m11_gen1
diff --git a/src/gencode/fock_p01_m11_generated2.F90 b/src/gencode/fock_p01_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d7395f5defb5c66815ed81a9db1bda413f4a4fec
--- /dev/null
+++ b/src/gencode/fock_p01_m11_generated2.F90
@@ -0,0 +1,271 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_m112
+
+end module fock_p01_m11_gen2
diff --git a/src/gencode/fock_p01_m12_generated1.F90 b/src/gencode/fock_p01_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1228c9ed840f94910202035010e972b0807edc72
--- /dev/null
+++ b/src/gencode/fock_p01_m12_generated1.F90
@@ -0,0 +1,364 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_m121
+
+end module fock_p01_m12_gen1
diff --git a/src/gencode/fock_p01_m12_generated2.F90 b/src/gencode/fock_p01_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..59ed47083f0f7f43375ea8d80285734fbeeedd91
--- /dev/null
+++ b/src/gencode/fock_p01_m12_generated2.F90
@@ -0,0 +1,364 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_m122
+
+end module fock_p01_m12_gen2
diff --git a/src/gencode/fock_p01_m12_generated3.F90 b/src/gencode/fock_p01_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b3b6e39c76b8b8667770c62edfccfa35a3172b0e
--- /dev/null
+++ b/src/gencode/fock_p01_m12_generated3.F90
@@ -0,0 +1,364 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_m123
+
+end module fock_p01_m12_gen3
diff --git a/src/gencode/fock_p01_m12_generated4.F90 b/src/gencode/fock_p01_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..21229a51f6108da32a69b2681745e9d7181d8523
--- /dev/null
+++ b/src/gencode/fock_p01_m12_generated4.F90
@@ -0,0 +1,363 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_m124
+
+end module fock_p01_m12_gen4
diff --git a/src/gencode/fock_p01_p01_generated1.F90 b/src/gencode/fock_p01_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..396a19ea8c7196f267da2a8a3955855ddb6552b0
--- /dev/null
+++ b/src/gencode/fock_p01_p01_generated1.F90
@@ -0,0 +1,390 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p011( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p011
+
+end module fock_p01_p01_gen1
diff --git a/src/gencode/fock_p01_p01_generated2.F90 b/src/gencode/fock_p01_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8e36b3ec9f3fb8bb9342a169f981a37e0825af3d
--- /dev/null
+++ b/src/gencode/fock_p01_p01_generated2.F90
@@ -0,0 +1,404 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p012( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p012
+
+end module fock_p01_p01_gen2
diff --git a/src/gencode/fock_p01_p02_generated1.F90 b/src/gencode/fock_p01_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8232e97f620fee2dde8309434bf9a7699b255f28
--- /dev/null
+++ b/src/gencode/fock_p01_p02_generated1.F90
@@ -0,0 +1,522 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p021( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_p021
+
+end module fock_p01_p02_gen1
diff --git a/src/gencode/fock_p01_p02_generated2.F90 b/src/gencode/fock_p01_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..46363e411f7253291267dc1e3fba738a10fde0f5
--- /dev/null
+++ b/src/gencode/fock_p01_p02_generated2.F90
@@ -0,0 +1,522 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p022( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_p022
+
+end module fock_p01_p02_gen2
diff --git a/src/gencode/fock_p01_p02_generated3.F90 b/src/gencode/fock_p01_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..583c7a5b18afa91876341601471049ac801ffb4a
--- /dev/null
+++ b/src/gencode/fock_p01_p02_generated3.F90
@@ -0,0 +1,522 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p023( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_p023
+
+end module fock_p01_p02_gen3
diff --git a/src/gencode/fock_p01_p02_generated4.F90 b/src/gencode/fock_p01_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6011e98125a489ea6f5b573950bf28506f9e2338
--- /dev/null
+++ b/src/gencode/fock_p01_p02_generated4.F90
@@ -0,0 +1,521 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p024( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p01_p024
+
+end module fock_p01_p02_gen4
diff --git a/src/gencode/fock_p01_p11_generated1.F90 b/src/gencode/fock_p01_p11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3cdfc7ab8812a06da8ea952c5a76fbadc0701d9f
--- /dev/null
+++ b/src/gencode/fock_p01_p11_generated1.F90
@@ -0,0 +1,251 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p111
+
+end module fock_p01_p11_gen1
diff --git a/src/gencode/fock_p01_p11_generated2.F90 b/src/gencode/fock_p01_p11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a2da88ae65b17e09f7847e5ba2a30563d7a7d3ea
--- /dev/null
+++ b/src/gencode/fock_p01_p11_generated2.F90
@@ -0,0 +1,249 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p112
+
+end module fock_p01_p11_gen2
diff --git a/src/gencode/fock_p01_p12_generated1.F90 b/src/gencode/fock_p01_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..dc9079b12e3727d653ea4f2a8ce88f4bb83a85f3
--- /dev/null
+++ b/src/gencode/fock_p01_p12_generated1.F90
@@ -0,0 +1,606 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p121
+
+end module fock_p01_p12_gen1
diff --git a/src/gencode/fock_p01_p12_generated2.F90 b/src/gencode/fock_p01_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0b6330f89529cf239f6beefb7ecfbe190fcbe6b0
--- /dev/null
+++ b/src/gencode/fock_p01_p12_generated2.F90
@@ -0,0 +1,604 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p01_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p01_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p01_p122
+
+end module fock_p01_p12_gen2
diff --git a/src/gencode/fock_p02_m12_generated1.F90 b/src/gencode/fock_p02_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..739e854e51c0aaec90d61d1f6b82711b3238b6f8
--- /dev/null
+++ b/src/gencode/fock_p02_m12_generated1.F90
@@ -0,0 +1,1026 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_m121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_m121
+
+end module fock_p02_m12_gen1
diff --git a/src/gencode/fock_p02_m12_generated2.F90 b/src/gencode/fock_p02_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1d80702b47ce7f5510674f63c57ea787e09fec92
--- /dev/null
+++ b/src/gencode/fock_p02_m12_generated2.F90
@@ -0,0 +1,1698 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_m122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_m122
+
+end module fock_p02_m12_gen2
diff --git a/src/gencode/fock_p02_m12_generated3.F90 b/src/gencode/fock_p02_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..22a6ec8f9b748c2b60bbfc68519bd80ae6e22ece
--- /dev/null
+++ b/src/gencode/fock_p02_m12_generated3.F90
@@ -0,0 +1,1698 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_m123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_m123
+
+end module fock_p02_m12_gen3
diff --git a/src/gencode/fock_p02_m12_generated4.F90 b/src/gencode/fock_p02_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..306e7463459b6dbfa455cc1989d5945f8f4ed940
--- /dev/null
+++ b/src/gencode/fock_p02_m12_generated4.F90
@@ -0,0 +1,1041 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_m124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t1      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t2      ,diffI(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_m124
+
+end module fock_p02_m12_gen4
diff --git a/src/gencode/fock_p02_p02_generated1.F90 b/src/gencode/fock_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fe6e48d7e1a5e658de66a73d3dc8dc22458c32b7
--- /dev/null
+++ b/src/gencode/fock_p02_p02_generated1.F90
@@ -0,0 +1,1854 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p021
+
+end module fock_p02_p02_gen1
diff --git a/src/gencode/fock_p02_p02_generated2.F90 b/src/gencode/fock_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cafb3f727541eb9dd7b71353edc145e12be0746f
--- /dev/null
+++ b/src/gencode/fock_p02_p02_generated2.F90
@@ -0,0 +1,3415 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p022
+
+end module fock_p02_p02_gen2
diff --git a/src/gencode/fock_p02_p02_generated3.F90 b/src/gencode/fock_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e37d0bb4731d057237d0ca13d7349b3cbfb61ccd
--- /dev/null
+++ b/src/gencode/fock_p02_p02_generated3.F90
@@ -0,0 +1,3415 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p023
+
+end module fock_p02_p02_gen3
diff --git a/src/gencode/fock_p02_p02_generated4.F90 b/src/gencode/fock_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..abd7f0bdc92c893b8ea7b537988b1ca355f983f8
--- /dev/null
+++ b/src/gencode/fock_p02_p02_generated4.F90
@@ -0,0 +1,2165 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p2      ,p4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p024
+
+end module fock_p02_p02_gen4
diff --git a/src/gencode/fock_p02_p12_generated1.F90 b/src/gencode/fock_p02_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2a561ca4b5d0481b8350443a9365bb50707e6704
--- /dev/null
+++ b/src/gencode/fock_p02_p12_generated1.F90
@@ -0,0 +1,868 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p121
+
+end module fock_p02_p12_gen1
diff --git a/src/gencode/fock_p02_p12_generated2.F90 b/src/gencode/fock_p02_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d0e32253173c4b6191dcdda08d188d9ba6a024c7
--- /dev/null
+++ b/src/gencode/fock_p02_p12_generated2.F90
@@ -0,0 +1,868 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p122
+
+end module fock_p02_p12_gen2
diff --git a/src/gencode/fock_p02_p12_generated3.F90 b/src/gencode/fock_p02_p12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..806111f12b5ebcf78684b0f4e693e460958746cd
--- /dev/null
+++ b/src/gencode/fock_p02_p12_generated3.F90
@@ -0,0 +1,868 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p123
+
+end module fock_p02_p12_gen3
diff --git a/src/gencode/fock_p02_p12_generated4.F90 b/src/gencode/fock_p02_p12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..35d9cd814448098091b5849efd2dc44bea7c30b6
--- /dev/null
+++ b/src/gencode/fock_p02_p12_generated4.F90
@@ -0,0 +1,867 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p02_p12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p02_p124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p2      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_fock_p02_p124
+
+end module fock_p02_p12_gen4
diff --git a/src/gencode/fock_p11_p11_generated.F90 b/src/gencode/fock_p11_p11_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8deff3e5dfc7b60bcce4c9cead53d9922b62250e
--- /dev/null
+++ b/src/gencode/fock_p11_p11_generated.F90
@@ -0,0 +1,293 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p11_p11_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p11_p11( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p11_p11
+
+end module fock_p11_p11_gen
diff --git a/src/gencode/fock_p11_p12_generated1.F90 b/src/gencode/fock_p11_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2b6b95a6aa696cf9f5370d3ec8c56560c32ce233
--- /dev/null
+++ b/src/gencode/fock_p11_p12_generated1.F90
@@ -0,0 +1,347 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p11_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p11_p121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p11_p121
+
+end module fock_p11_p12_gen1
diff --git a/src/gencode/fock_p11_p12_generated2.F90 b/src/gencode/fock_p11_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8860bfc0edc08cc8c021a1e884cf52358c2fa8bd
--- /dev/null
+++ b/src/gencode/fock_p11_p12_generated2.F90
@@ -0,0 +1,345 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p11_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p11_p122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t1      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,t2      )
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p11_p122
+
+end module fock_p11_p12_gen2
diff --git a/src/gencode/fock_p11_p20_generated.F90 b/src/gencode/fock_p11_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9605f453f40aab03b6b361ff51b196bea60ee0bd
--- /dev/null
+++ b/src/gencode/fock_p11_p20_generated.F90
@@ -0,0 +1,519 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p11_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p11_p20( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t4      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(t3      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p11_p20
+
+end module fock_p11_p20_gen
diff --git a/src/gencode/fock_p12_p12_generated1.F90 b/src/gencode/fock_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3bde3cbbe7709029a5b549514316558e3f2a0d0c
--- /dev/null
+++ b/src/gencode/fock_p12_p12_generated1.F90
@@ -0,0 +1,1271 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p12_p121
+
+end module fock_p12_p12_gen1
diff --git a/src/gencode/fock_p12_p12_generated2.F90 b/src/gencode/fock_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8eadb3410e637ba9b9cf1f551b7e0a4f481d6834
--- /dev/null
+++ b/src/gencode/fock_p12_p12_generated2.F90
@@ -0,0 +1,1338 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(p1      ,p3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p12_p122
+
+end module fock_p12_p12_gen2
diff --git a/src/gencode/fock_p12_p20_generated1.F90 b/src/gencode/fock_p12_p20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..77789ba8da47598bd9809b726c7521c925c60e48
--- /dev/null
+++ b/src/gencode/fock_p12_p20_generated1.F90
@@ -0,0 +1,520 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p12_p20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p12_p201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p12_p201
+
+end module fock_p12_p20_gen1
diff --git a/src/gencode/fock_p12_p20_generated2.F90 b/src/gencode/fock_p12_p20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..03fdedc404ac2c8f0b3f8cc71cfae52a8b3bd28c
--- /dev/null
+++ b/src/gencode/fock_p12_p20_generated2.F90
@@ -0,0 +1,518 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p12_p20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p12_p202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(fock), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(p1      ,diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p12_p202
+
+end module fock_p12_p20_gen2
diff --git a/src/gencode/fock_p20_p20_generated.F90 b/src/gencode/fock_p20_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..baf6dc6d6685ee7b4f7abd083faaa63db2481cd4
--- /dev/null
+++ b/src/gencode/fock_p20_p20_generated.F90
@@ -0,0 +1,989 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module fock_p20_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_fock_p20_p20( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, pmin, pmax, fock)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: fock
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t2      ,t4      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              elm = psign * tsign * fock(t1      ,t3      )
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * fock(diffI(1),diffJ(1))
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif 
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_fock_p20_p20
+
+end module fock_p20_p20_gen
diff --git a/src/gencode/generated.F90 b/src/gencode/generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bd6c03585d364d3c3fd68933f510296b6e26a24f
--- /dev/null
+++ b/src/gencode/generated.F90
@@ -0,0 +1,9646 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hdiag.x: DO NOT EDIT!
+module codegen_hdiag
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use gener_guess
+
+  implicit none
+
+contains
+
+  subroutine build_hdiag_gen(hdiag, rspin, d, fock, o_info, int_info, &
+      nelact, prog_info)
+
+    Real(kd_dble), dimension(:), allocatable, intent(inout) :: hdiag
+    type(spinrlist), intent(in)                             :: rspin
+    type(deter_dblocklist), intent(in)                      :: d
+    real(kd_dble), dimension(:,:), allocatable, intent(in)  :: fock
+    type(o_infotype), intent(in)                            :: o_info
+    type(int_infotype), intent(in)                          :: int_info
+    integer, intent(in)                                     :: nelact
+    type(prog_infotype), intent(in)                         :: prog_info
+
+    integer, parameter :: nintkind = 6
+    character(2), dimension(nintkind) :: &
+          intkindnamelist = (/ 'aa', 'oo', 'vv', 'ov', 'oa', 'av' /)
+    type(intkind_JK_p), pointer :: intkindlist(:)
+    type(intkind_JK) :: intkind
+    integer :: i, idblock, blockname, indx, spinindx, ndet
+    type(deter_dblock), pointer :: Dblock
+    type(spindetact_list), pointer :: spinref
+    type(intblock) :: twoint, twointx
+
+    !Initialisation
+    hdiag(:) = 0.d0
+    call intkind_JK_all_init(intkindlist,intkindnamelist,nintkind)
+
+    !Fock
+    !Get the determinant block
+    do indx = 1, d%nblock
+      Dblock => d%detblock(indx)%p
+      ndet = Dblock%ndet
+
+      if (ndet.ne.0) then
+        !Get the Active parts
+        spinindx = get_Rspinindx(dblock%nelCAS)
+        spinref => rspin%l(spinindx)%p
+        call hdiag_fock(hdiag, spinref, dblock, fock, o_info, nelact, dblock%shift)
+      endif
+    enddo
+    do i =1,nintkind
+      intkind = intkindlist(i)%p
+      call get_twoint(twoint,  intkind%intname, o_info, int_info, prog_info%id_cpu)
+      if (intkind%lintx) then
+        call get_twoint(twointx, intkind%intxname, o_info, int_info, prog_info%id_cpu)
+      endif
+      do idblock = 1, intkind%ndblock
+        blockname = intkind%dnamelist(idblock)
+        indx = get_deter_block_index(d,blockname)
+        Dblock => d%detblock(indx)%p
+
+      ndet = Dblock%ndet
+
+      if (ndet.ne.0) then
+        !Get the Active parts 
+        spinindx = get_Rspinindx(dblock%nelCAS)
+        spinref => rspin%l(spinindx)%p
+        call hdiag_intkind_dblock(hdiag, spinref, dblock, intkind, o_info, &
+              blockname, twoint, twointx, nelact)
+      endif
+      enddo !Loop over the determinant blocks
+      call intblock_free(twoint)
+      if (intkind%lintx) then
+        call intblock_free(twointx)
+      endif
+    enddo !Loop over integral blocks
+    call intkind_JK_all_free(intkindlist,nintkind)
+  end subroutine build_hdiag_gen
+
+  subroutine hdiag_intkind_dblock(hdiag, spinref, dblock, intkind, o_info, &
+              blockname, twoint, twointx, nelact)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(intkind_JK) :: intkind
+    type(o_infotype), intent(in)               :: o_info
+    type(intblock)                             :: twoint, twointx
+    integer, intent(in)                        :: blockname, nelact
+
+    select case (intkind%name)
+    case ('aa')
+      select case (blockname)
+      case (0)
+      call hdiag_aa_000(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (1)
+      call hdiag_aa_p01(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (2)
+      call hdiag_aa_p02(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (11)
+      call hdiag_aa_p11(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (12)
+      call hdiag_aa_p12(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (-11)
+      call hdiag_aa_m11(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (-12)
+      call hdiag_aa_m12(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (20)
+      call hdiag_aa_p20(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (-20)
+      call hdiag_aa_m20(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      end select
+
+    case ('oo')
+      select case (blockname)
+      case (2)
+      call hdiag_oo_p02(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (12)
+      call hdiag_oo_p12(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (20)
+      call hdiag_oo_p20(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      end select
+
+    case ('vv')
+      select case (blockname)
+      case (2)
+      call hdiag_vv_p02(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (-12)
+      call hdiag_vv_m12(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      case (-20)
+      call hdiag_vv_m20(hdiag, spinref, dblock, o_info, twoint, &
+            nelact, intkind)
+      end select
+
+    case ('ov')
+      select case (blockname)
+      case (1)
+      call hdiag_ov_p01(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (2)
+      call hdiag_ov_p02(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (12)
+      call hdiag_ov_p12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (-12)
+      call hdiag_ov_m12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      end select
+
+    case ('oa')
+      select case (blockname)
+      case (1)
+      call hdiag_oa_p01(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (2)
+      call hdiag_oa_p02(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (11)
+      call hdiag_oa_p11(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (12)
+      call hdiag_oa_p12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (-12)
+      call hdiag_oa_m12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (20)
+      call hdiag_oa_p20(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      end select
+
+    case ('av')
+      select case (blockname)
+      case (1)
+      call hdiag_av_p01(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (2)
+      call hdiag_av_p02(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (12)
+      call hdiag_av_p12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (-11)
+      call hdiag_av_m11(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (-12)
+      call hdiag_av_m12(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      case (-20)
+      call hdiag_av_m20(hdiag, spinref, dblock, o_info, twoint, &
+            twointx, nelact, intkind)
+      end select
+
+    end select
+  end subroutine hdiag_intkind_dblock
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block 000 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_000(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_aa_000
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p01 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_p01(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_p01
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_p02(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p11 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_p11(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_aa_p11
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p12 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_p12(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_p12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m11 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_m11(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_m11
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m12 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_m12(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_m12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p20 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_p20(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+          enddo
+        enddo
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_aa_p20
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m20 and integrals aa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_aa_m20(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact) 
+
+              do l=1, nelact+dblock%nelCAS
+                do k=1, l-1
+                  hdiag(detshift+i) = hdiag(detshift+i) &
+                      + ijkl(twoint,a(k),a(k),a(l),a(l))
+                  if (s(k) .eq. s(l)) then
+                    hdiag(detshift + i) = hdiag(detshift+ i) &
+                        - ijkl(twoint,a(k),a(l),a(k),a(l))
+                  endif
+                enddo
+              enddo
+            enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_aa_m20
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals oo
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oo_p02(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oo_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p12 and integrals oo
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oo_p12(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oo_p12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p20 and integrals oo
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oo_p20(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,t1,t1,t2,t2)
+              JK = JK - ijkl(twoint,t1,t2,t1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_oo_p20
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals vv
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_vv_p02(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_vv_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m12 and integrals vv
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_vv_m12(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_vv_m12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m20 and integrals vv
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_vv_m20(hdiag, spinref, dblock, o_info, twoint, &
+      nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,p2,p2)
+              JK = JK - ijkl(twoint,p1,p2,p1,p2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_vv_m20
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p01 and integrals ov
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_ov_p01(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_ov_p01
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals ov
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_ov_p02(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t2,t2)
+              JK = JK - ijkl(twointx,p2,t2,p2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_ov_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p12 and integrals ov
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_ov_p12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t2,t2)
+              JK = JK - ijkl(twointx,p1,t2,p1,t2)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_ov_p12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m12 and integrals ov
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_ov_m12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p1,p1,t1,t1)
+              JK = JK - ijkl(twointx,p1,t1,p1,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            JK = 0.d0
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              JK = ijkl(twoint,p2,p2,t1,t1)
+              JK = JK - ijkl(twointx,p2,t1,p2,t1)
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_ov_m12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p01 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_p01(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oa_p01
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_p02(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oa_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p11 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_p11(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_oa_p11
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p12 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_p12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oa_p12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m12 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_m12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_oa_m12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p20 and integrals oa
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_oa_p20(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    detshiftp = dblock%shift
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t1,t1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t1,a(k),t1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),t2,t2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),t2,a(k),t2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    deallocate(a)
+    deallocate(s)
+
+  end subroutine hdiag_oa_p20
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p01 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_p01(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_p01
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p02 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_p02(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(9) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(9)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(10)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(11)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(12) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(12)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(13) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(13)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 4)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(14)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(15)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(16) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(16)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_p02
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block p12 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_p12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1, t2
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        isfth = ngel
+        !up up
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up occup ligodn, ligoup ligodn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !t1dn t2up ligoup occdn
+        do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          do t1 = isfth + 1, isfth + nocc
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+
+        !dn dn
+        do t2 = isfth + 1, isfth+nocc+nligo
+          do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+          enddo
+        enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_p12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m11 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_m11(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: p1
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP& PRIVATE(p1, a, s, detshift, detshiftp, spinindx), &
+    !$OMP& PRIVATE(idetact, isft, ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(1) +(p1-isftp-1)*dblock%deltashiftp_array(1)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+    end do
+    !$OMP END DO
+
+    !dn
+    !$OMP DO
+    do p1 = isftp + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift +&
+          dblock%shiftspinp_array(2) + (p1-isftp-1)*dblock%deltashiftp_array(2)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+    end do
+    !$OMP END DO
+
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_m11
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m12 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_m12(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: t1
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblock%deltashifth_array(1)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblock%deltashifth_array(2)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblock%deltashifth_array(3)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblock%deltashifth_array(4)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblock%deltashifth_array(5)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblock%deltashifth_array(6)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        !up
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblock%deltashifth_array(7)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 3)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+
+        !dn
+        do t1 = isfth + 1, isfth+nocc+nligo
+          detshift = detshiftp + dblock%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblock%deltashifth_array(8)
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 1)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+        end do
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_m12
+
+  !$====================================================================
+  !> @brief Add J-K to hdiag for block m20 and integrals av
+  !> @author ER (generated)
+  !> @date June 2018
+  !$====================================================================
+  subroutine hdiag_av_m20(hdiag, spinref, dblock, o_info, twoint, &
+      twointx, nelact, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intkind_JK), intent(in)               :: intkind
+    type(intblock)                             :: twoint
+    type(intblock)                             :: twointx
+
+    integer :: detshift, detshiftp
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, no, ng
+    integer :: sign
+    integer :: isftp, isfth
+    integer :: p1, p2
+    integer, allocatable :: a(:), s(:)
+    integer :: spinindx, idetact, isft, ndetact, i, j, k, l
+    integer(kindact) :: detact
+    real(kd_dble) :: JK
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+
+    sign = intkind%sign
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(twoint, hdiag, spinref, dblock ),&
+    !$OMP& SHARED(twointx),&
+    !$OMP& SHARED(nact, nelact, ng, no, ngel, nligo, nocc, nligv, nvirt, isfth, isftp, sign),&
+    !$OMP&PRIVATE(p1,p2,a,s,detshift,detshiftp,spinindx), &
+    !$OMP& PRIVATE(idetact,isft,ndetact,i,j,k,l,detact,JK)
+
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+
+    !up up
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(1) &
+           + (dblock%shiftp_array(p2-isftp) + (p1-isftp-1))*dblock%deltashiftp_array(1)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, -2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, isftp + nligv
+      detshiftp = dblock%shift + dblock%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblock%deltashiftp_array(2)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+     !p1up p2dn virtup ligvdn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+      do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+      detshiftp = dblock%shift + dblock%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblock%deltashiftp_array(3)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. 1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 0)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftp = dblock%shift + dblock%shiftspinp_array(4) &
+          + (dblock%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblock%deltashiftp_array(4)
+        detshift = detshiftp
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p1,p1)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p1,a(k),p1)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+            !Get the active determinant block for spin
+            spinindx = get_spinCatindx(spinref, 2)
+            isft = spinref%ShiftSpinCat(spinindx)
+            ndetact = spinref%NdetSpinCat(spinindx)
+            do i=1,ndetact
+              JK = 0.d0
+              idetact = isft+i
+              detact = spinref%elms(idetact)
+              call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+
+              do k=1, nelact+dblock%nelCAS
+                JK = JK + ijkl(twoint,a(k),a(k),p2,p2)
+                if (s(k) .eq. -1) then
+                  JK = JK - ijkl(twointx,a(k),p2,a(k),p2)
+                endif
+              enddo
+              Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+            enddo
+      end do
+    end do
+    !$OMP END DO
+    deallocate(a)
+    deallocate(s)
+
+    !$OMP END PARALLEL
+  end subroutine hdiag_av_m20
+
+end module codegen_hdiag
diff --git a/src/gencode/hv_generated.F90 b/src/gencode/hv_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..67c7f2b4f7bbce75a4b5b94aa68aeec2090f3e4b
--- /dev/null
+++ b/src/gencode/hv_generated.F90
@@ -0,0 +1,2215 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module codegen_hv
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  use fock_gen
+  use aaaa_gen
+  use vvaa_gen
+  use vaao_gen
+  use vaaa_gen
+  use aaoo_gen
+  use aaao_gen
+  use vvoo_gen
+  use vvao_gen
+  use vaoo_gen
+  use vava_gen
+  use vvvo_gen
+  use vvva_gen
+  use vvvv_gen
+  use oooo_gen
+  use vovo_gen
+  use aooo_gen
+  use vavo_gen
+  use vooo_gen
+  use aoao_gen
+  use voao_gen
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_gen(VmI, WmI, spinrefI, dblockI, indxI, &
+              VmJ, WmJ, spinrefJ, dblockJ, indxJ, spincase, pmin, pmax, fock, o_info, &
+              nelact, hcase_info, pcase_info, intkind, &
+              twoint, twointx, intcases)
+
+    type(deter_dblock), pointer, intent(in)                :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in)             :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)                   :: VmI, VmJ
+    type(vecMblock), pointer, intent(inout)                :: WmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(in) :: fock
+    type(o_infotype), intent(in)                           :: o_info
+    integer, intent(in)                                    :: nelact, indxI, indxJ, spincase, pmin, pmax
+    type(case_infotype), intent(in)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                            :: intkind
+    type(intblock), intent(in)                             :: twoint, twointx
+    type(intcase_list), intent(in)                         :: intcases
+
+    select case (intkind%name)
+    case ('fock')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (0)
+          call hv_blocs_fock_000_000(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (1)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_000_p011(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_000_p012(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (11)
+          call hv_blocs_fock_000_p11(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (-11)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_000_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_000_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (1)
+        select case (DblockJ%name)
+        case (1)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_p011(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_p012(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (2)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_p021(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_p022(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_p01_p023(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_p01_p024(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (11)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_p111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_p112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-11)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p01_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p01_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_p01_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_p01_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p02_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p02_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_p02_p123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_p02_p124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p02_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p02_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_p02_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_p02_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (11)
+          call hv_blocs_fock_p11_p11(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p11_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p11_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (20)
+          call hv_blocs_fock_p11_p20(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (20)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_p12_p201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_p12_p202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-11)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m11_m111(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m11_m112(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m11_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m11_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_m11_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_m11_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-20)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m11_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m11_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_m11_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_m11_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        case (-20)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m12_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m12_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_m12_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_m12_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      case (20)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_fock_p20_p20(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        case (-20)
+        select case (spincase)
+        case (1)
+          call hv_blocs_fock_m20_m201(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (2)
+          call hv_blocs_fock_m20_m202(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (3)
+          call hv_blocs_fock_m20_m203(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        case (4)
+          call hv_blocs_fock_m20_m204(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, pmin, pmax, fock)
+        end select
+        end select
+      end select
+    case ('aaaa')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (0)
+          call hv_blocs_aaaa_000_000(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (1)
+        select case (DblockJ%name)
+        case (1)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_p01_p011(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_p01_p012(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaaa_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaaa_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (11)
+          call hv_blocs_aaaa_p11_p11(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_m11_m111(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_m11_m112(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaaa_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaaa_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (20)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_aaaa_p20_p20(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaaa_m20_m201(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaaa_m20_m202(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaaa_m20_m203(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaaa_m20_m204(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      end select
+    case ('aaao')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (11)
+          call hv_blocs_aaao_000_p11(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info,  &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (1)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaao_p01_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaao_p01_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaao_p01_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaao_p01_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaao_p02_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaao_p02_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaao_p02_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaao_p02_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_aaao_p11_p20(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info,  &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaao_m12_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaao_m12_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaao_m12_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaao_m12_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vaaa')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_000_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_000_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (1)
+        select case (DblockJ%name)
+        case (11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_p01_p111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_p01_p112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_p01_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_p01_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaaa_p01_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaaa_p01_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_p02_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_p02_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaaa_p02_p123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaaa_p02_p124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_p12_p201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_p12_p202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaaa_m11_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaaa_m11_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaaa_m11_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaaa_m11_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('aaoo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (1)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaoo_p01_p011(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaoo_p01_p012(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaoo_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaoo_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaoo_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaoo_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (11)
+          call hv_blocs_aaoo_p11_p11(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaoo_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaoo_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aaoo_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aaoo_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aaoo_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aaoo_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (20)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_aaoo_p20_p20(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      end select
+    case ('vaao')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (1)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_000_p011(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_000_p012(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (1)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p01_p021(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p01_p022(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaao_p01_p023(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaao_p01_p024(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p01_p201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p01_p202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p01_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p01_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaao_p01_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaao_p01_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p11_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p11_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p11_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p11_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_p12_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_p12_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaao_p12_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaao_p12_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaao_m11_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaao_m11_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaao_m11_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaao_m11_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvaa')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (1)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_p01_p011(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_p01_p012(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvaa_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvaa_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_m11_m111(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_m11_m112(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvaa_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvaa_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvaa_m20_m201(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvaa_m20_m202(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvaa_m20_m203(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvaa_m20_m204(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      end select
+    case ('vaoo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaoo_p01_p111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaoo_p01_p112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaoo_p01_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaoo_p01_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaoo_p01_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaoo_p01_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaoo_p02_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaoo_p02_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vaoo_p02_p123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vaoo_p02_p124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vaoo_p12_p201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vaoo_p12_p202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvao')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvao_p01_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvao_p01_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvao_p01_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvao_p01_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvao_p02_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvao_p02_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvao_p02_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvao_p02_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvao_m12_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvao_m12_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvao_m12_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvao_m12_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvoo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (1)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvoo_p01_p011(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvoo_p01_p012(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvoo_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvoo_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvoo_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvoo_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvoo_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvoo_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvoo_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvoo_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvoo_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvoo_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      end select
+    case ('vava')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vava_000_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vava_000_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vava_000_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vava_000_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vava_p02_p201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vava_p02_p202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vava_p02_p203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vava_p02_p204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vava_p11_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vava_p11_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vava_p11_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vava_p11_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvvo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvvo_p01_p021(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvvo_p01_p022(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvvo_p01_p023(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvvo_p01_p024(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvvo_m11_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvvo_m11_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvvo_m11_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvvo_m11_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvva')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvva_p01_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvva_p01_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvva_p01_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvva_p01_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvva_p02_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvva_p02_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvva_p02_p123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvva_p02_p124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvva_m11_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvva_m11_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvva_m11_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvva_m11_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vvvv')
+      select case (DblockI%name)
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvvv_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvvv_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvvv_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvvv_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvvv_m12_m121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvvv_m12_m122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvvv_m12_m123(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvvv_m12_m124(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vvvv_m20_m201(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vvvv_m20_m202(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vvvv_m20_m203(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vvvv_m20_m204(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      end select
+    case ('oooo')
+      select case (DblockI%name)
+      case (2)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_oooo_p02_p021(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_oooo_p02_p022(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_oooo_p02_p023(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_oooo_p02_p024(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_oooo_p12_p121(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_oooo_p12_p122(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (20)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_oooo_p20_p20(VmI, spinrefI, dblockI, &
+                      WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+        end select
+      end select
+    case ('vovo')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vovo_000_p021(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vovo_000_p022(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vovo_000_p023(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vovo_000_p024(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('aooo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aooo_p01_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aooo_p01_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aooo_p02_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aooo_p02_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aooo_p02_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aooo_p02_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_aooo_p11_p20(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info,  &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vavo')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (-12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vavo_000_m121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vavo_000_m122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vavo_000_m123(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vavo_000_m124(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vavo_p02_p111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vavo_p02_p112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vavo_p02_p113(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vavo_p02_p114(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (11)
+        select case (DblockJ%name)
+        end select
+      case (-12)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('vooo')
+      select case (DblockI%name)
+      case (1)
+        select case (DblockJ%name)
+        case (2)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vooo_p01_p021(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vooo_p01_p022(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_vooo_p01_p023(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_vooo_p01_p024(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        end select
+      case (11)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_vooo_p11_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_vooo_p11_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('aoao')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (20)
+          call hv_blocs_aoao_000_p20(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info,  &
+                      pmin, pmax, twoint, twointx)
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (-20)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aoao_p02_m201(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aoao_p02_m202(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_aoao_p02_m203(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_aoao_p02_m204(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_aoao_p12_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_aoao_p12_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        end select
+      case (20)
+        select case (DblockJ%name)
+        end select
+      case (-20)
+        select case (DblockJ%name)
+        end select
+      end select
+    case ('voao')
+      select case (DblockI%name)
+      case (0)
+        select case (DblockJ%name)
+        case (12)
+          select case (spincase)
+          case (1)
+          call hv_blocs_voao_000_p121(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_voao_000_p122(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (2)
+        select case (DblockJ%name)
+        case (-11)
+          select case (spincase)
+          case (1)
+          call hv_blocs_voao_p02_m111(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (2)
+          call hv_blocs_voao_p02_m112(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (3)
+          call hv_blocs_voao_p02_m113(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          case (4)
+          call hv_blocs_voao_p02_m114(VmI, VmJ, spinrefI, dblockI, &
+                      WmI%elms, WmJ%elms, WmJ%nvec, spinrefJ, dblockJ, o_info, &
+                      nelact, hcase_info, pcase_info, &
+                      pmin, pmax, twoint, twointx)
+          end select
+        end select
+      case (12)
+        select case (DblockJ%name)
+        end select
+      case (-11)
+        select case (DblockJ%name)
+        end select
+      end select
+    end select
+
+  end subroutine hv_blocs_gen
+
+end module codegen_hv
diff --git a/src/gencode/oooo_generated.F90 b/src/gencode/oooo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4b2bca1ce1cec908983d9601c781441bbcbb7fff
--- /dev/null
+++ b/src/gencode/oooo_generated.F90
@@ -0,0 +1,47 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use oooo_p02_p02_gen1
+  use oooo_p02_p02_gen2
+  use oooo_p02_p02_gen3
+  use oooo_p02_p02_gen4
+  use oooo_p12_p12_gen1
+  use oooo_p12_p12_gen2
+  use oooo_p20_p20_gen
+end module oooo_gen
diff --git a/src/gencode/oooo_p02_p02_generated1.F90 b/src/gencode/oooo_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..67b363638f198914693a08a619e4f3b84bfbdb29
--- /dev/null
+++ b/src/gencode/oooo_p02_p02_generated1.F90
@@ -0,0 +1,1584 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_oooo_p02_p021
+
+end module oooo_p02_p02_gen1
diff --git a/src/gencode/oooo_p02_p02_generated2.F90 b/src/gencode/oooo_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6670f8eb0f7b34b9b7aaee6af51dec9c083b494e
--- /dev/null
+++ b/src/gencode/oooo_p02_p02_generated2.F90
@@ -0,0 +1,2941 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_oooo_p02_p022
+
+end module oooo_p02_p02_gen2
diff --git a/src/gencode/oooo_p02_p02_generated3.F90 b/src/gencode/oooo_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4dfad3d11263c7f645bb3c9ab14c3b78779aba05
--- /dev/null
+++ b/src/gencode/oooo_p02_p02_generated3.F90
@@ -0,0 +1,2941 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_oooo_p02_p023
+
+end module oooo_p02_p02_gen3
diff --git a/src/gencode/oooo_p02_p02_generated4.F90 b/src/gencode/oooo_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..410cce48afa78c8c03114d5d0c824a60ed92caab
--- /dev/null
+++ b/src/gencode/oooo_p02_p02_generated4.F90
@@ -0,0 +1,1579 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          p4 = p2
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_oooo_p02_p024
+
+end module oooo_p02_p02_gen4
diff --git a/src/gencode/oooo_p12_p12_generated1.F90 b/src/gencode/oooo_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e9741ccabd187fb40e56878ef78527d0aa8b3907
--- /dev/null
+++ b/src/gencode/oooo_p12_p12_generated1.F90
@@ -0,0 +1,1535 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_oooo_p12_p121
+
+end module oooo_p12_p12_gen1
diff --git a/src/gencode/oooo_p12_p12_generated2.F90 b/src/gencode/oooo_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b023887b2623d4c15e49fc4a66488894725347ba
--- /dev/null
+++ b/src/gencode/oooo_p12_p12_generated2.F90
@@ -0,0 +1,1533 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 dn
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_oooo_p12_p122
+
+end module oooo_p12_p12_gen2
diff --git a/src/gencode/oooo_p20_p20_generated.F90 b/src/gencode/oooo_p20_p20_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..eebebe2fbe164079667439a45e9dd9b7a11d7d2b
--- /dev/null
+++ b/src/gencode/oooo_p20_p20_generated.F90
@@ -0,0 +1,1506 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module oooo_p20_p20_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_oooo_p20_p20( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !spinpI = 0
+    !$OMP PARALLEL &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot) &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t2 < t3 < t1
+            do t4 = isfth+nocc+1, t2-1
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(1)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 < t2 < t1
+            do t3 = max(t4+1,isfth+nocc+1), t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(15), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t4      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(17), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t1      ,t1      ,t2      ,t4      )&
+                  +&
+                    ijkl2(twoint,t1      ,t2      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 < t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(19), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,t1      ,t3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twoint,t1      ,t4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,t2      ,t2      ,t1      ,t3      )&
+                  +&
+                    ijkl2(twoint,t2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_oooo_p20_p20
+
+end module oooo_p20_p20_gen
diff --git a/src/gencode/vaaa_000_m11_generated1.F90 b/src/gencode/vaaa_000_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..37893bebb50cd0c9d05c9fcef69654e003a0eba0
--- /dev/null
+++ b/src/gencode/vaaa_000_m11_generated1.F90
@@ -0,0 +1,218 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_000_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_000_m111( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_000_m111
+
+end module vaaa_000_m11_gen1
diff --git a/src/gencode/vaaa_000_m11_generated2.F90 b/src/gencode/vaaa_000_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f12350d5713c8c231953360c5b39246c782060bf
--- /dev/null
+++ b/src/gencode/vaaa_000_m11_generated2.F90
@@ -0,0 +1,216 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_000_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_000_m112( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_000_m112
+
+end module vaaa_000_m11_gen2
diff --git a/src/gencode/vaaa_generated.F90 b/src/gencode/vaaa_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..78e7056ae903570c6088563e292f32526ff30ef8
--- /dev/null
+++ b/src/gencode/vaaa_generated.F90
@@ -0,0 +1,58 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vaaa_000_m11_gen1
+  use vaaa_000_m11_gen2
+  use vaaa_p01_p11_gen1
+  use vaaa_p01_p11_gen2
+  use vaaa_p01_m12_gen1
+  use vaaa_p01_m12_gen2
+  use vaaa_p01_m12_gen3
+  use vaaa_p01_m12_gen4
+  use vaaa_p02_p12_gen1
+  use vaaa_p02_p12_gen2
+  use vaaa_p02_p12_gen3
+  use vaaa_p02_p12_gen4
+  use vaaa_p12_p20_gen1
+  use vaaa_p12_p20_gen2
+  use vaaa_m11_m20_gen1
+  use vaaa_m11_m20_gen2
+  use vaaa_m11_m20_gen3
+  use vaaa_m11_m20_gen4
+end module vaaa_gen
diff --git a/src/gencode/vaaa_m11_m20_generated1.F90 b/src/gencode/vaaa_m11_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3e4c1072409f61150cce86fe6dfac0ce91bd8586
--- /dev/null
+++ b/src/gencode/vaaa_m11_m20_generated1.F90
@@ -0,0 +1,315 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_m11_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_m11_m201( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_m11_m201
+
+end module vaaa_m11_m20_gen1
diff --git a/src/gencode/vaaa_m11_m20_generated2.F90 b/src/gencode/vaaa_m11_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..40d74d4f0c71f625186c26a4ae463169d666a4c4
--- /dev/null
+++ b/src/gencode/vaaa_m11_m20_generated2.F90
@@ -0,0 +1,315 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_m11_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_m11_m202( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_m11_m202
+
+end module vaaa_m11_m20_gen2
diff --git a/src/gencode/vaaa_m11_m20_generated3.F90 b/src/gencode/vaaa_m11_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..de493fcdf8634bb17b30aed33eb6e0257ba8a29d
--- /dev/null
+++ b/src/gencode/vaaa_m11_m20_generated3.F90
@@ -0,0 +1,315 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_m11_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_m11_m203( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_m11_m203
+
+end module vaaa_m11_m20_gen3
diff --git a/src/gencode/vaaa_m11_m20_generated4.F90 b/src/gencode/vaaa_m11_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fb1f847c8fc9842311070c9ef7f5b9a314aa10bb
--- /dev/null
+++ b/src/gencode/vaaa_m11_m20_generated4.F90
@@ -0,0 +1,314 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_m11_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_m11_m204( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_m11_m204
+
+end module vaaa_m11_m20_gen4
diff --git a/src/gencode/vaaa_p01_m12_generated1.F90 b/src/gencode/vaaa_p01_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..44f2b233e711b61a4836efc8e9131aff323590d1
--- /dev/null
+++ b/src/gencode/vaaa_p01_m12_generated1.F90
@@ -0,0 +1,545 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p01_m121
+
+end module vaaa_p01_m12_gen1
diff --git a/src/gencode/vaaa_p01_m12_generated2.F90 b/src/gencode/vaaa_p01_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f16d4e231c073d9d84a9a87d3bc32e9a68041547
--- /dev/null
+++ b/src/gencode/vaaa_p01_m12_generated2.F90
@@ -0,0 +1,545 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p01_m122
+
+end module vaaa_p01_m12_gen2
diff --git a/src/gencode/vaaa_p01_m12_generated3.F90 b/src/gencode/vaaa_p01_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2431140d2e268821bb5a75c690ee5f612b2a02cc
--- /dev/null
+++ b/src/gencode/vaaa_p01_m12_generated3.F90
@@ -0,0 +1,545 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p01_m123
+
+end module vaaa_p01_m12_gen3
diff --git a/src/gencode/vaaa_p01_m12_generated4.F90 b/src/gencode/vaaa_p01_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..64cd9e83cfdf81c3e8bbf02e5135b699bc609a8c
--- /dev/null
+++ b/src/gencode/vaaa_p01_m12_generated4.F90
@@ -0,0 +1,544 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p01_m124
+
+end module vaaa_p01_m12_gen4
diff --git a/src/gencode/vaaa_p01_p11_generated1.F90 b/src/gencode/vaaa_p01_p11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3adffa7ff4e4d8a56868d59a5ce7f1fdac0e5418
--- /dev/null
+++ b/src/gencode/vaaa_p01_p11_generated1.F90
@@ -0,0 +1,342 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_p11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_p111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_p01_p111
+
+end module vaaa_p01_p11_gen1
diff --git a/src/gencode/vaaa_p01_p11_generated2.F90 b/src/gencode/vaaa_p01_p11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..514d78bd1e60282bf3bdc9f01fbb42ca57bcb388
--- /dev/null
+++ b/src/gencode/vaaa_p01_p11_generated2.F90
@@ -0,0 +1,340 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p01_p11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p01_p112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_p01_p112
+
+end module vaaa_p01_p11_gen2
diff --git a/src/gencode/vaaa_p02_p12_generated1.F90 b/src/gencode/vaaa_p02_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2445e6d0c7d84a7034079b1366ef35326485c446
--- /dev/null
+++ b/src/gencode/vaaa_p02_p12_generated1.F90
@@ -0,0 +1,1421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p02_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p02_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p02_p121
+
+end module vaaa_p02_p12_gen1
diff --git a/src/gencode/vaaa_p02_p12_generated2.F90 b/src/gencode/vaaa_p02_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f1e8dc7046371dfb3be8b60f108cd5dd7ce3035b
--- /dev/null
+++ b/src/gencode/vaaa_p02_p12_generated2.F90
@@ -0,0 +1,1421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p02_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p02_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p02_p122
+
+end module vaaa_p02_p12_gen2
diff --git a/src/gencode/vaaa_p02_p12_generated3.F90 b/src/gencode/vaaa_p02_p12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..55e0ccaeaf3a701bb776bb9cba93df9675383b8e
--- /dev/null
+++ b/src/gencode/vaaa_p02_p12_generated3.F90
@@ -0,0 +1,1421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p02_p12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p02_p123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p02_p123
+
+end module vaaa_p02_p12_gen3
diff --git a/src/gencode/vaaa_p02_p12_generated4.F90 b/src/gencode/vaaa_p02_p12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f491655f6871e75105744b8aaa30d7d3b0f14f9b
--- /dev/null
+++ b/src/gencode/vaaa_p02_p12_generated4.F90
@@ -0,0 +1,1420 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p02_p12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p02_p124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p2      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact  
+                  JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaaa_p02_p124
+
+end module vaaa_p02_p12_gen4
diff --git a/src/gencode/vaaa_p12_p20_generated1.F90 b/src/gencode/vaaa_p12_p20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..431d649150e07d946a9bce672867252cee9f5189
--- /dev/null
+++ b/src/gencode/vaaa_p12_p20_generated1.F90
@@ -0,0 +1,791 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p12_p20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p12_p201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_p12_p201
+
+end module vaaa_p12_p20_gen1
diff --git a/src/gencode/vaaa_p12_p20_generated2.F90 b/src/gencode/vaaa_p12_p20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..73e02a1913d5ac355ec02aecb4fecd953690777a
--- /dev/null
+++ b/src/gencode/vaaa_p12_p20_generated2.F90
@@ -0,0 +1,789 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaaa_p12_p20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaaa_p12_p202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+                do k = 1, Nelact+1
+                  JK = JK +ijkl2(twoint,p1      ,diffJ(1),andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twoint,p1      ,andIJ(k),diffJ(1),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffI(1),diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaaa_p12_p202
+
+end module vaaa_p12_p20_gen2
diff --git a/src/gencode/vaao_000_p01_generated1.F90 b/src/gencode/vaao_000_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b11b3d66b4a1ac56c23ba19f26818f8fcc10fee4
--- /dev/null
+++ b/src/gencode/vaao_000_p01_generated1.F90
@@ -0,0 +1,279 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_000_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_000_p011( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_000_p011
+
+end module vaao_000_p01_gen1
diff --git a/src/gencode/vaao_000_p01_generated2.F90 b/src/gencode/vaao_000_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..618fb08290f7d05b3317d3d649e39b1dd3a08c11
--- /dev/null
+++ b/src/gencode/vaao_000_p01_generated2.F90
@@ -0,0 +1,277 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_000_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_000_p012( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_000_p012
+
+end module vaao_000_p01_gen2
diff --git a/src/gencode/vaao_generated.F90 b/src/gencode/vaao_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1024be7d912dad6e2e4db225d1b96d2d3ea8be6b
--- /dev/null
+++ b/src/gencode/vaao_generated.F90
@@ -0,0 +1,64 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vaao_000_p01_gen1
+  use vaao_000_p01_gen2
+  use vaao_p01_p02_gen1
+  use vaao_p01_p02_gen2
+  use vaao_p01_p02_gen3
+  use vaao_p01_p02_gen4
+  use vaao_p01_p20_gen1
+  use vaao_p01_p20_gen2
+  use vaao_p01_m20_gen1
+  use vaao_p01_m20_gen2
+  use vaao_p01_m20_gen3
+  use vaao_p01_m20_gen4
+  use vaao_p11_p12_gen1
+  use vaao_p11_p12_gen2
+  use vaao_p11_m11_gen1
+  use vaao_p11_m11_gen2
+  use vaao_p12_m12_gen1
+  use vaao_p12_m12_gen2
+  use vaao_p12_m12_gen3
+  use vaao_p12_m12_gen4
+  use vaao_m11_m12_gen1
+  use vaao_m11_m12_gen2
+  use vaao_m11_m12_gen3
+  use vaao_m11_m12_gen4
+end module vaao_gen
diff --git a/src/gencode/vaao_m11_m12_generated1.F90 b/src/gencode/vaao_m11_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cc51d40550a97da872df93e4040fcd296d22195b
--- /dev/null
+++ b/src/gencode/vaao_m11_m12_generated1.F90
@@ -0,0 +1,421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_m11_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_m11_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_m11_m121
+
+end module vaao_m11_m12_gen1
diff --git a/src/gencode/vaao_m11_m12_generated2.F90 b/src/gencode/vaao_m11_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a3a3d6c3a323ee94f39d1bf2339ccb039d4fbb4e
--- /dev/null
+++ b/src/gencode/vaao_m11_m12_generated2.F90
@@ -0,0 +1,421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_m11_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_m11_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_m11_m122
+
+end module vaao_m11_m12_gen2
diff --git a/src/gencode/vaao_m11_m12_generated3.F90 b/src/gencode/vaao_m11_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bb6aa040adcfeee31160c66c995f7f8f9ae1e146
--- /dev/null
+++ b/src/gencode/vaao_m11_m12_generated3.F90
@@ -0,0 +1,421 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_m11_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_m11_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_m11_m123
+
+end module vaao_m11_m12_gen3
diff --git a/src/gencode/vaao_m11_m12_generated4.F90 b/src/gencode/vaao_m11_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..082bae9bede38f2e7e0e6a24bb9764b301fe3ffe
--- /dev/null
+++ b/src/gencode/vaao_m11_m12_generated4.F90
@@ -0,0 +1,420 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_m11_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_m11_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_m11_m124
+
+end module vaao_m11_m12_gen4
diff --git a/src/gencode/vaao_p01_m20_generated1.F90 b/src/gencode/vaao_p01_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3f45225b25d26b92829f3bf2a1c4e1717fa7b7bb
--- /dev/null
+++ b/src/gencode/vaao_p01_m20_generated1.F90
@@ -0,0 +1,345 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_m201( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_m201
+
+end module vaao_p01_m20_gen1
diff --git a/src/gencode/vaao_p01_m20_generated2.F90 b/src/gencode/vaao_p01_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..854af372e2d349c915042f951bff8763df785e3e
--- /dev/null
+++ b/src/gencode/vaao_p01_m20_generated2.F90
@@ -0,0 +1,345 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_m202( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_m202
+
+end module vaao_p01_m20_gen2
diff --git a/src/gencode/vaao_p01_m20_generated3.F90 b/src/gencode/vaao_p01_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f105bf11545da9e4fed7c1d80755bb03dcb290f3
--- /dev/null
+++ b/src/gencode/vaao_p01_m20_generated3.F90
@@ -0,0 +1,345 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_m203( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_m203
+
+end module vaao_p01_m20_gen3
diff --git a/src/gencode/vaao_p01_m20_generated4.F90 b/src/gencode/vaao_p01_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8461cdda04ab70336c8f3d6871334db881cba1ec
--- /dev/null
+++ b/src/gencode/vaao_p01_m20_generated4.F90
@@ -0,0 +1,344 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_m204( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_m204
+
+end module vaao_p01_m20_gen4
diff --git a/src/gencode/vaao_p01_p02_generated1.F90 b/src/gencode/vaao_p01_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fecb45fe1d6b0bbdbae660f72744d1db5e9e8241
--- /dev/null
+++ b/src/gencode/vaao_p01_p02_generated1.F90
@@ -0,0 +1,1275 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p021( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_p021
+
+end module vaao_p01_p02_gen1
diff --git a/src/gencode/vaao_p01_p02_generated2.F90 b/src/gencode/vaao_p01_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9b6a4362b652ac61025f3db9584e7e97decb3a6f
--- /dev/null
+++ b/src/gencode/vaao_p01_p02_generated2.F90
@@ -0,0 +1,1275 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p022( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_p022
+
+end module vaao_p01_p02_gen2
diff --git a/src/gencode/vaao_p01_p02_generated3.F90 b/src/gencode/vaao_p01_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..63bf5dc0046b1de02d021963fbf8a6e00b6dc9bc
--- /dev/null
+++ b/src/gencode/vaao_p01_p02_generated3.F90
@@ -0,0 +1,1275 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p023( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_p023
+
+end module vaao_p01_p02_gen3
diff --git a/src/gencode/vaao_p01_p02_generated4.F90 b/src/gencode/vaao_p01_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0956cf7d4a866f28219b0a4a09f0d3b57e549d52
--- /dev/null
+++ b/src/gencode/vaao_p01_p02_generated4.F90
@@ -0,0 +1,1274 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p024( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p2      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p2      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p2      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p01_p024
+
+end module vaao_p01_p02_gen4
diff --git a/src/gencode/vaao_p01_p20_generated1.F90 b/src/gencode/vaao_p01_p20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..740161345818d799102655495709975caad689db
--- /dev/null
+++ b/src/gencode/vaao_p01_p20_generated1.F90
@@ -0,0 +1,579 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p01_p201
+
+end module vaao_p01_p20_gen1
diff --git a/src/gencode/vaao_p01_p20_generated2.F90 b/src/gencode/vaao_p01_p20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8216340b19438a5bd3d7a52ae12d16cab987b631
--- /dev/null
+++ b/src/gencode/vaao_p01_p20_generated2.F90
@@ -0,0 +1,577 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p01_p20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p01_p202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p01_p202
+
+end module vaao_p01_p20_gen2
diff --git a/src/gencode/vaao_p11_m11_generated1.F90 b/src/gencode/vaao_p11_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..95262afe1cd10f133941e73284b2de80ccaf13e7
--- /dev/null
+++ b/src/gencode/vaao_p11_m11_generated1.F90
@@ -0,0 +1,234 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p11_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p11_m111( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p11_m111
+
+end module vaao_p11_m11_gen1
diff --git a/src/gencode/vaao_p11_m11_generated2.F90 b/src/gencode/vaao_p11_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..23f2a95c9ecf49b4da43a855fa358667c00ed30f
--- /dev/null
+++ b/src/gencode/vaao_p11_m11_generated2.F90
@@ -0,0 +1,232 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p11_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p11_m112( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = 1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            do t3 = isfth + 1, isfth+nocc+nligo
+            !spint3 = -1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(2), &
+                   0                 ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p11_m112
+
+end module vaao_p11_m11_gen2
diff --git a/src/gencode/vaao_p11_p12_generated1.F90 b/src/gencode/vaao_p11_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7a77a0bc490734c87ae42801ce62068947295724
--- /dev/null
+++ b/src/gencode/vaao_p11_p12_generated1.F90
@@ -0,0 +1,724 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p11_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p11_p121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p11_p121
+
+end module vaao_p11_p12_gen1
diff --git a/src/gencode/vaao_p11_p12_generated2.F90 b/src/gencode/vaao_p11_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..25ee2644ff0fd56a85ab89fd56ba9d9ac0463893
--- /dev/null
+++ b/src/gencode/vaao_p11_p12_generated2.F90
@@ -0,0 +1,722 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p11_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p11_p122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t1      )&
+                    +ijkl2(twointx,p1      ,t1      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK -delta(-1,spinandIJ(k))*&
+                  ijkl2(twoint,p1      ,andIJ(k),andIJ(k),t2      )&
+                    +ijkl2(twointx,p1      ,t2      ,andIJ(k),andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffI(1),t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaao_p11_p122
+
+end module vaao_p11_p12_gen2
diff --git a/src/gencode/vaao_p12_m12_generated1.F90 b/src/gencode/vaao_p12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..185e8c332b377bb2ff2e227bad925ed89d1d31cf
--- /dev/null
+++ b/src/gencode/vaao_p12_m12_generated1.F90
@@ -0,0 +1,1019 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p12_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p12_m121
+
+end module vaao_p12_m12_gen1
diff --git a/src/gencode/vaao_p12_m12_generated2.F90 b/src/gencode/vaao_p12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b9811257ec7aa45dddf1a562c6f6b15a136f158e
--- /dev/null
+++ b/src/gencode/vaao_p12_m12_generated2.F90
@@ -0,0 +1,1019 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p12_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p12_m122
+
+end module vaao_p12_m12_gen2
diff --git a/src/gencode/vaao_p12_m12_generated3.F90 b/src/gencode/vaao_p12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..20165b7ddf79659342838f370d2347d332be26c0
--- /dev/null
+++ b/src/gencode/vaao_p12_m12_generated3.F90
@@ -0,0 +1,1019 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p12_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p12_m123
+
+end module vaao_p12_m12_gen3
diff --git a/src/gencode/vaao_p12_m12_generated4.F90 b/src/gencode/vaao_p12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d520b87675460b01054a3846b2b578a91f467ba6
--- /dev/null
+++ b/src/gencode/vaao_p12_m12_generated4.F90
@@ -0,0 +1,1018 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaao_p12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaao_p12_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p2      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t4      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),diffJ(2),t3      )&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaao_p12_m124
+
+end module vaao_p12_m12_gen4
diff --git a/src/gencode/vaoo_generated.F90 b/src/gencode/vaoo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0d31a5bbb0945c4466bc6c33ec93210b39671307
--- /dev/null
+++ b/src/gencode/vaoo_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vaoo_p01_p11_gen1
+  use vaoo_p01_p11_gen2
+  use vaoo_p01_m12_gen1
+  use vaoo_p01_m12_gen2
+  use vaoo_p01_m12_gen3
+  use vaoo_p01_m12_gen4
+  use vaoo_p02_p12_gen1
+  use vaoo_p02_p12_gen2
+  use vaoo_p02_p12_gen3
+  use vaoo_p02_p12_gen4
+  use vaoo_p12_p20_gen1
+  use vaoo_p12_p20_gen2
+end module vaoo_gen
diff --git a/src/gencode/vaoo_p01_m12_generated1.F90 b/src/gencode/vaoo_p01_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..875cc27ef7e8fbccf37d07fc720821e3c80c9d3f
--- /dev/null
+++ b/src/gencode/vaoo_p01_m12_generated1.F90
@@ -0,0 +1,923 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p01_m121
+
+end module vaoo_p01_m12_gen1
diff --git a/src/gencode/vaoo_p01_m12_generated2.F90 b/src/gencode/vaoo_p01_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..de8b5626f540464d941f9095049fe354f0d82870
--- /dev/null
+++ b/src/gencode/vaoo_p01_m12_generated2.F90
@@ -0,0 +1,923 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p01_m122
+
+end module vaoo_p01_m12_gen2
diff --git a/src/gencode/vaoo_p01_m12_generated3.F90 b/src/gencode/vaoo_p01_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..085d28766447fc9ae228212247a59bcfd0552b84
--- /dev/null
+++ b/src/gencode/vaoo_p01_m12_generated3.F90
@@ -0,0 +1,923 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p01_m123
+
+end module vaoo_p01_m12_gen3
diff --git a/src/gencode/vaoo_p01_m12_generated4.F90 b/src/gencode/vaoo_p01_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4ce3faeff85236ed9aaa2f38ee6cb0e6aa3e4a61
--- /dev/null
+++ b/src/gencode/vaoo_p01_m12_generated4.F90
@@ -0,0 +1,922 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p01_m124
+
+end module vaoo_p01_m12_gen4
diff --git a/src/gencode/vaoo_p01_p11_generated1.F90 b/src/gencode/vaoo_p01_p11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..22578a592b429705b42ecd70d45e09fb6c8be714
--- /dev/null
+++ b/src/gencode/vaoo_p01_p11_generated1.F90
@@ -0,0 +1,529 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_p11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_p111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaoo_p01_p111
+
+end module vaoo_p01_p11_gen1
diff --git a/src/gencode/vaoo_p01_p11_generated2.F90 b/src/gencode/vaoo_p01_p11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c062a1c56bc4e6ffda51e0ecd7b6e0cf6bf5976b
--- /dev/null
+++ b/src/gencode/vaoo_p01_p11_generated2.F90
@@ -0,0 +1,527 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p01_p11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p01_p112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,diffJ(1),t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaoo_p01_p112
+
+end module vaoo_p01_p11_gen2
diff --git a/src/gencode/vaoo_p02_p12_generated1.F90 b/src/gencode/vaoo_p02_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..30b3d4da7077af37385c35a10e3a7ddc8a0d5632
--- /dev/null
+++ b/src/gencode/vaoo_p02_p12_generated1.F90
@@ -0,0 +1,6023 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p02_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p02_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p02_p121
+
+end module vaoo_p02_p12_gen1
diff --git a/src/gencode/vaoo_p02_p12_generated2.F90 b/src/gencode/vaoo_p02_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ab7ec8cb2213b59dff6ed8a58d73c7c509430920
--- /dev/null
+++ b/src/gencode/vaoo_p02_p12_generated2.F90
@@ -0,0 +1,6033 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p02_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p02_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p02_p122
+
+end module vaoo_p02_p12_gen2
diff --git a/src/gencode/vaoo_p02_p12_generated3.F90 b/src/gencode/vaoo_p02_p12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1f53496c8b39874b3eb91c50ca4451786c8ef511
--- /dev/null
+++ b/src/gencode/vaoo_p02_p12_generated3.F90
@@ -0,0 +1,6033 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p02_p12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p02_p123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p02_p123
+
+end module vaoo_p02_p12_gen3
diff --git a/src/gencode/vaoo_p02_p12_generated4.F90 b/src/gencode/vaoo_p02_p12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1ca406e0ed02fd281502b797d1fd81629ef91084
--- /dev/null
+++ b/src/gencode/vaoo_p02_p12_generated4.F90
@@ -0,0 +1,6042 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p02_p12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p02_p124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p2      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p2      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vaoo_p02_p124
+
+end module vaoo_p02_p12_gen4
diff --git a/src/gencode/vaoo_p12_p20_generated1.F90 b/src/gencode/vaoo_p12_p20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c30ab0e1d7f0a861936bcb3eeb3fd1aa419bdcc3
--- /dev/null
+++ b/src/gencode/vaoo_p12_p20_generated1.F90
@@ -0,0 +1,3110 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p12_p20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p12_p201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaoo_p12_p201
+
+end module vaoo_p12_p20_gen1
diff --git a/src/gencode/vaoo_p12_p20_generated2.F90 b/src/gencode/vaoo_p12_p20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..61d5700b54f0b0983545f50cdae7f562b7105daf
--- /dev/null
+++ b/src/gencode/vaoo_p12_p20_generated2.F90
@@ -0,0 +1,3118 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vaoo_p12_p20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vaoo_p12_p202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t1
+            !t2 < t1 < t4 < t3
+            do t4 = t1+1, isfth+nocc+nligo
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+              !Not possible - add the shift
+            enddo !t3
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t1 < t3
+            t4 = t2
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            !*** t4 = t1
+            !t2 < t4 < t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            !*** t4 < t1
+            do t4 = isfth+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            else !t1 in occ
+            !*** t4 = t1
+            !t2 < t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t1      )
+                JK = JK -delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,diffJ(1),t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vaoo_p12_p202
+
+end module vaoo_p12_p20_gen2
diff --git a/src/gencode/vava_000_m20_generated1.F90 b/src/gencode/vava_000_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3ba8d71f54494df0d4632e14a3b36463cabb2aa2
--- /dev/null
+++ b/src/gencode/vava_000_m20_generated1.F90
@@ -0,0 +1,184 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_000_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_000_m201( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_000_m201
+
+end module vava_000_m20_gen1
diff --git a/src/gencode/vava_000_m20_generated2.F90 b/src/gencode/vava_000_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7a172ce3e9c91af1964d113106dd15d9d4056bca
--- /dev/null
+++ b/src/gencode/vava_000_m20_generated2.F90
@@ -0,0 +1,184 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_000_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_000_m202( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_000_m202
+
+end module vava_000_m20_gen2
diff --git a/src/gencode/vava_000_m20_generated3.F90 b/src/gencode/vava_000_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..00640543fac26a34ec8d7d28999a0485ae154625
--- /dev/null
+++ b/src/gencode/vava_000_m20_generated3.F90
@@ -0,0 +1,184 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_000_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_000_m203( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_000_m203
+
+end module vava_000_m20_gen3
diff --git a/src/gencode/vava_000_m20_generated4.F90 b/src/gencode/vava_000_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..49ffe155cb474c4ac48f1dd8e8d35b5a02b5ece2
--- /dev/null
+++ b/src/gencode/vava_000_m20_generated4.F90
@@ -0,0 +1,183 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_000_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_000_m204( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_000_m204
+
+end module vava_000_m20_gen4
diff --git a/src/gencode/vava_generated.F90 b/src/gencode/vava_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2ea4d296402edb90bc14eec74be34b1fa00200ab
--- /dev/null
+++ b/src/gencode/vava_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vava_000_m20_gen1
+  use vava_000_m20_gen2
+  use vava_000_m20_gen3
+  use vava_000_m20_gen4
+  use vava_p02_p20_gen1
+  use vava_p02_p20_gen2
+  use vava_p02_p20_gen3
+  use vava_p02_p20_gen4
+  use vava_p11_m12_gen1
+  use vava_p11_m12_gen2
+  use vava_p11_m12_gen3
+  use vava_p11_m12_gen4
+end module vava_gen
diff --git a/src/gencode/vava_p02_p20_generated1.F90 b/src/gencode/vava_p02_p20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..100fd40534f383d0b41d59e8b9c13890eaf42e2d
--- /dev/null
+++ b/src/gencode/vava_p02_p20_generated1.F90
@@ -0,0 +1,562 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p02_p20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p02_p201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p02_p201
+
+end module vava_p02_p20_gen1
diff --git a/src/gencode/vava_p02_p20_generated2.F90 b/src/gencode/vava_p02_p20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4cfef64122f16c44e84df0d747f0998c15b5414c
--- /dev/null
+++ b/src/gencode/vava_p02_p20_generated2.F90
@@ -0,0 +1,562 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p02_p20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p02_p202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p02_p202
+
+end module vava_p02_p20_gen2
diff --git a/src/gencode/vava_p02_p20_generated3.F90 b/src/gencode/vava_p02_p20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cb0d6b2a45b0dcdbf8b1c4ef358792ffe833bfc1
--- /dev/null
+++ b/src/gencode/vava_p02_p20_generated3.F90
@@ -0,0 +1,562 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p02_p20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p02_p203( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p02_p203
+
+end module vava_p02_p20_gen3
diff --git a/src/gencode/vava_p02_p20_generated4.F90 b/src/gencode/vava_p02_p20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3d982b64aaa1aaea3d8f8bc3d7110db7024a09f1
--- /dev/null
+++ b/src/gencode/vava_p02_p20_generated4.F90
@@ -0,0 +1,561 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p02_p20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p02_p204( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p02_p204
+
+end module vava_p02_p20_gen4
diff --git a/src/gencode/vava_p11_m12_generated1.F90 b/src/gencode/vava_p11_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6b4478e7e13ca80e92686d03ea8afdf2fb40998e
--- /dev/null
+++ b/src/gencode/vava_p11_m12_generated1.F90
@@ -0,0 +1,269 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p11_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p11_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p11_m121
+
+end module vava_p11_m12_gen1
diff --git a/src/gencode/vava_p11_m12_generated2.F90 b/src/gencode/vava_p11_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b14d807352364d5d461601b3f74e3d37af897b94
--- /dev/null
+++ b/src/gencode/vava_p11_m12_generated2.F90
@@ -0,0 +1,269 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p11_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p11_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p11_m122
+
+end module vava_p11_m12_gen2
diff --git a/src/gencode/vava_p11_m12_generated3.F90 b/src/gencode/vava_p11_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..475c8b90625c3222cb73eff8609dd3ae3d59f928
--- /dev/null
+++ b/src/gencode/vava_p11_m12_generated3.F90
@@ -0,0 +1,269 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p11_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p11_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p11_m123
+
+end module vava_p11_m12_gen3
diff --git a/src/gencode/vava_p11_m12_generated4.F90 b/src/gencode/vava_p11_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5969095fd9d27aed5dec0a53965d990de19a679d
--- /dev/null
+++ b/src/gencode/vava_p11_m12_generated4.F90
@@ -0,0 +1,268 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vava_p11_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vava_p11_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =2
+
+              !CM2 
+              call CM2_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM2, detCM2, detCM2orb)
+              do jpos = 1,nCM2
+                idetactJ = detCM2(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                call extract_detCMorb(detCM2orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                j = idetactJ - isftJ
+                JK = 0.d0
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl2(twoint,p1      ,diffJ(1),p2      ,diffJ(2))&
+                  -delta(-1,spindiffJ(2))*&
+                    ijkl2(twoint,p1      ,diffJ(2),p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*  modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vava_p11_m124
+
+end module vava_p11_m12_gen4
diff --git a/src/gencode/vavo_000_m12_generated1.F90 b/src/gencode/vavo_000_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..82b714c0d58eeef649998b332273ec38729453be
--- /dev/null
+++ b/src/gencode/vavo_000_m12_generated1.F90
@@ -0,0 +1,251 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_000_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_000_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_000_m121
+
+end module vavo_000_m12_gen1
diff --git a/src/gencode/vavo_000_m12_generated2.F90 b/src/gencode/vavo_000_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4046c2d03995c5b5b29125fe1651c8241845c785
--- /dev/null
+++ b/src/gencode/vavo_000_m12_generated2.F90
@@ -0,0 +1,251 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_000_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_000_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_000_m122
+
+end module vavo_000_m12_gen2
diff --git a/src/gencode/vavo_000_m12_generated3.F90 b/src/gencode/vavo_000_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2bf0285a7bc208c0d910bf253d66fbced6f2569d
--- /dev/null
+++ b/src/gencode/vavo_000_m12_generated3.F90
@@ -0,0 +1,251 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_000_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_000_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_000_m123
+
+end module vavo_000_m12_gen3
diff --git a/src/gencode/vavo_000_m12_generated4.F90 b/src/gencode/vavo_000_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4bcee2894cf758808705468ef58ef66769d646f2
--- /dev/null
+++ b/src/gencode/vavo_000_m12_generated4.F90
@@ -0,0 +1,250 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_000_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_000_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_000_m124
+
+end module vavo_000_m12_gen4
diff --git a/src/gencode/vavo_generated.F90 b/src/gencode/vavo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..af93c72d778dfea14ff54d7dbbc35e1bc0d3f299
--- /dev/null
+++ b/src/gencode/vavo_generated.F90
@@ -0,0 +1,48 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vavo_000_m12_gen1
+  use vavo_000_m12_gen2
+  use vavo_000_m12_gen3
+  use vavo_000_m12_gen4
+  use vavo_p02_p11_gen1
+  use vavo_p02_p11_gen2
+  use vavo_p02_p11_gen3
+  use vavo_p02_p11_gen4
+end module vavo_gen
diff --git a/src/gencode/vavo_p02_p11_generated1.F90 b/src/gencode/vavo_p02_p11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..675a6f514ce04b9e23257d7b858a4badf9db0861
--- /dev/null
+++ b/src/gencode/vavo_p02_p11_generated1.F90
@@ -0,0 +1,597 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_p02_p11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_p02_p111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_p02_p111
+
+end module vavo_p02_p11_gen1
diff --git a/src/gencode/vavo_p02_p11_generated2.F90 b/src/gencode/vavo_p02_p11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a9a8091e87f2dd406ff1528770784df336ff4a00
--- /dev/null
+++ b/src/gencode/vavo_p02_p11_generated2.F90
@@ -0,0 +1,597 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_p02_p11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_p02_p112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_p02_p112
+
+end module vavo_p02_p11_gen2
diff --git a/src/gencode/vavo_p02_p11_generated3.F90 b/src/gencode/vavo_p02_p11_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4c561c0435a6837ea62e68624715fcd1c2564939
--- /dev/null
+++ b/src/gencode/vavo_p02_p11_generated3.F90
@@ -0,0 +1,597 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_p02_p11_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_p02_p113( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_p02_p113
+
+end module vavo_p02_p11_gen3
diff --git a/src/gencode/vavo_p02_p11_generated4.F90 b/src/gencode/vavo_p02_p11_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cf98949c3da1560fefd9ad1cec6a370a5ff4b0f8
--- /dev/null
+++ b/src/gencode/vavo_p02_p11_generated4.F90
@@ -0,0 +1,596 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vavo_p02_p11_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vavo_p02_p114( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t1      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +delta(-1,spindiffJ(1))*&
+                  ijkl1(twoint,p1      ,diffJ(1),p2      ,t2      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twoint,p2      ,diffJ(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vavo_p02_p114
+
+end module vavo_p02_p11_gen4
diff --git a/src/gencode/voao_000_p12_generated1.F90 b/src/gencode/voao_000_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ad2f290f04b3dcbc4da1daf4b148ee4b8e354b0c
--- /dev/null
+++ b/src/gencode/voao_000_p12_generated1.F90
@@ -0,0 +1,377 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_000_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_000_p121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_voao_000_p121
+
+end module voao_000_p12_gen1
diff --git a/src/gencode/voao_000_p12_generated2.F90 b/src/gencode/voao_000_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..168c67f47191254fbe3194188889aa55df015f27
--- /dev/null
+++ b/src/gencode/voao_000_p12_generated2.F90
@@ -0,0 +1,373 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_000_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_000_p122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_voao_000_p122
+
+end module voao_000_p12_gen2
diff --git a/src/gencode/voao_generated.F90 b/src/gencode/voao_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..51de6a51d99291487eccf597b5e9c8d8bfab4c77
--- /dev/null
+++ b/src/gencode/voao_generated.F90
@@ -0,0 +1,46 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use voao_000_p12_gen1
+  use voao_000_p12_gen2
+  use voao_p02_m11_gen1
+  use voao_p02_m11_gen2
+  use voao_p02_m11_gen3
+  use voao_p02_m11_gen4
+end module voao_gen
diff --git a/src/gencode/voao_p02_m11_generated1.F90 b/src/gencode/voao_p02_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5b9663d09e8549ff1bc3aeebaf9f8ada04669835
--- /dev/null
+++ b/src/gencode/voao_p02_m11_generated1.F90
@@ -0,0 +1,583 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_p02_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_p02_m111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_voao_p02_m111
+
+end module voao_p02_m11_gen1
diff --git a/src/gencode/voao_p02_m11_generated2.F90 b/src/gencode/voao_p02_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6ce0c1ef653e4e4a8b675a607d9459a903300b55
--- /dev/null
+++ b/src/gencode/voao_p02_m11_generated2.F90
@@ -0,0 +1,581 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_p02_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_p02_m112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_voao_p02_m112
+
+end module voao_p02_m11_gen2
diff --git a/src/gencode/voao_p02_m11_generated3.F90 b/src/gencode/voao_p02_m11_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..73473810b9b27445622c4bcbdae143d2fe51a160
--- /dev/null
+++ b/src/gencode/voao_p02_m11_generated3.F90
@@ -0,0 +1,581 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_p02_m11_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_p02_m113( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_voao_p02_m113
+
+end module voao_p02_m11_gen3
diff --git a/src/gencode/voao_p02_m11_generated4.F90 b/src/gencode/voao_p02_m11_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..cab84f1f16d60e9b9e2ec99043515161df885c79
--- /dev/null
+++ b/src/gencode/voao_p02_m11_generated4.F90
@@ -0,0 +1,578 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module voao_p02_m11_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_voao_p02_m114( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,diffI(1),t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,diffI(1),t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_voao_p02_m114
+
+end module voao_p02_m11_gen4
diff --git a/src/gencode/vooo_generated.F90 b/src/gencode/vooo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5e1e84d2f6e078f2c7b2408961ba44be25e63fa3
--- /dev/null
+++ b/src/gencode/vooo_generated.F90
@@ -0,0 +1,46 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vooo_p01_p02_gen1
+  use vooo_p01_p02_gen2
+  use vooo_p01_p02_gen3
+  use vooo_p01_p02_gen4
+  use vooo_p11_p12_gen1
+  use vooo_p11_p12_gen2
+end module vooo_gen
diff --git a/src/gencode/vooo_p01_p02_generated1.F90 b/src/gencode/vooo_p01_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2cc383fc0de40df94e8ab97bdb5be71c20eb753f
--- /dev/null
+++ b/src/gencode/vooo_p01_p02_generated1.F90
@@ -0,0 +1,1095 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p01_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p01_p021( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p2      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p2      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          ! UUD0
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vooo_p01_p021
+
+end module vooo_p01_p02_gen1
diff --git a/src/gencode/vooo_p01_p02_generated2.F90 b/src/gencode/vooo_p01_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a88450ba4fc52707d22fa79ece9eed17154c7a3e
--- /dev/null
+++ b/src/gencode/vooo_p01_p02_generated2.F90
@@ -0,0 +1,1091 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p01_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p01_p022( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p2      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p2      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vooo_p01_p022
+
+end module vooo_p01_p02_gen2
diff --git a/src/gencode/vooo_p01_p02_generated3.F90 b/src/gencode/vooo_p01_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..58d5c9b5208efeee47e6fb6b45173ac967169815
--- /dev/null
+++ b/src/gencode/vooo_p01_p02_generated3.F90
@@ -0,0 +1,1091 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p01_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p01_p023( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p2      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p2      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          ! UDD0
+          !spinp3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vooo_p01_p023
+
+end module vooo_p01_p02_gen3
diff --git a/src/gencode/vooo_p01_p02_generated4.F90 b/src/gencode/vooo_p01_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ff90ad07f968da80590f579308d0c3a3fe04cecf
--- /dev/null
+++ b/src/gencode/vooo_p01_p02_generated4.F90
@@ -0,0 +1,1086 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p01_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p01_p024( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          ! DDD0
+          !spinp3 = -1
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p2      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p2      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p2      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vooo_p01_p024
+
+end module vooo_p01_p02_gen4
diff --git a/src/gencode/vooo_p11_p12_generated1.F90 b/src/gencode/vooo_p11_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7ae961510d7df76a419bc9b7dcffa57cd136e3fe
--- /dev/null
+++ b/src/gencode/vooo_p11_p12_generated1.F90
@@ -0,0 +1,634 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p11_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p11_p121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 < t1
+            do t3 = isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vooo_p11_p121
+
+end module vooo_p11_p12_gen1
diff --git a/src/gencode/vooo_p11_p12_generated2.F90 b/src/gencode/vooo_p11_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..98ae159f17263f48d7b1776e4b26f9b4600f3ff6
--- /dev/null
+++ b/src/gencode/vooo_p11_p12_generated2.F90
@@ -0,0 +1,628 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vooo_p11_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vooo_p11_p122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !DUD0
+            !spint3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(4)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 < t2 < t1
+            do t3 = isfth + 1, t2-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(14), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t1      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twoint,p1      ,t2      ,t1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 < t1
+            do t3 = t2+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(24), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,t2      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twoint,p1      ,t1      ,t2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(30), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vooo_p11_p122
+
+end module vooo_p11_p12_gen2
diff --git a/src/gencode/vovo_000_p02_generated1.F90 b/src/gencode/vovo_000_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..537e1a80ed6dfafb043ae1beb6b4d1d8a77407b0
--- /dev/null
+++ b/src/gencode/vovo_000_p02_generated1.F90
@@ -0,0 +1,253 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vovo_000_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vovo_000_p021( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   t1-ngel           ,t2-ngel           ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,p2      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vovo_000_p021
+
+end module vovo_000_p02_gen1
diff --git a/src/gencode/vovo_000_p02_generated2.F90 b/src/gencode/vovo_000_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9f532c2b68cf8d9b38aa1d29fe98edaaafc111ea
--- /dev/null
+++ b/src/gencode/vovo_000_p02_generated2.F90
@@ -0,0 +1,285 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vovo_000_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vovo_000_p022( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vovo_000_p022
+
+end module vovo_000_p02_gen2
diff --git a/src/gencode/vovo_000_p02_generated3.F90 b/src/gencode/vovo_000_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a2912af3c2de4427f2d8e1647e28a77513d139a6
--- /dev/null
+++ b/src/gencode/vovo_000_p02_generated3.F90
@@ -0,0 +1,285 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vovo_000_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vovo_000_p023( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vovo_000_p023
+
+end module vovo_000_p02_gen3
diff --git a/src/gencode/vovo_000_p02_generated4.F90 b/src/gencode/vovo_000_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..5bf9fb2a0cdedf34efb4ed49d9bf4d0b22030738
--- /dev/null
+++ b/src/gencode/vovo_000_p02_generated4.F90
@@ -0,0 +1,252 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vovo_000_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vovo_000_p024( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinpJ = 0
+          detshiftJ = 0
+          detshiftpJ = 0
+          psign = 1 - 2 * modulo(pcase_info(13)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(13), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,t1      ,p2      ,t2      )&
+                  -&
+                    ijkl2(twoint,p1      ,t2      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vovo_000_p024
+
+end module vovo_000_p02_gen4
diff --git a/src/gencode/vovo_generated.F90 b/src/gencode/vovo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c1f0ef0d5367f5064e6fde68a95947488ed92277
--- /dev/null
+++ b/src/gencode/vovo_generated.F90
@@ -0,0 +1,44 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vovo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vovo_000_p02_gen1
+  use vovo_000_p02_gen2
+  use vovo_000_p02_gen3
+  use vovo_000_p02_gen4
+end module vovo_gen
diff --git a/src/gencode/vvaa_generated.F90 b/src/gencode/vvaa_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c8879cddc66c3467455238a430e334bb8776cbcc
--- /dev/null
+++ b/src/gencode/vvaa_generated.F90
@@ -0,0 +1,58 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvaa_p01_p01_gen1
+  use vvaa_p01_p01_gen2
+  use vvaa_p02_p02_gen1
+  use vvaa_p02_p02_gen2
+  use vvaa_p02_p02_gen3
+  use vvaa_p02_p02_gen4
+  use vvaa_p12_p12_gen1
+  use vvaa_p12_p12_gen2
+  use vvaa_m11_m11_gen1
+  use vvaa_m11_m11_gen2
+  use vvaa_m12_m12_gen1
+  use vvaa_m12_m12_gen2
+  use vvaa_m12_m12_gen3
+  use vvaa_m12_m12_gen4
+  use vvaa_m20_m20_gen1
+  use vvaa_m20_m20_gen2
+  use vvaa_m20_m20_gen3
+  use vvaa_m20_m20_gen4
+end module vvaa_gen
diff --git a/src/gencode/vvaa_m11_m11_generated1.F90 b/src/gencode/vvaa_m11_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..95201083010aa9727423058a3accfb3293e4f593
--- /dev/null
+++ b/src/gencode/vvaa_m11_m11_generated1.F90
@@ -0,0 +1,258 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m11_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m11_m111( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_m11_m111
+
+end module vvaa_m11_m11_gen1
diff --git a/src/gencode/vvaa_m11_m11_generated2.F90 b/src/gencode/vvaa_m11_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4289a84a658d27e9db2e6a2526e9f2da80f07ff2
--- /dev/null
+++ b/src/gencode/vvaa_m11_m11_generated2.F90
@@ -0,0 +1,302 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m11_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m11_m112( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact-1))
+                allocate(spinandIJ(nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_m11_m112
+
+end module vvaa_m11_m11_gen2
diff --git a/src/gencode/vvaa_m12_m12_generated1.F90 b/src/gencode/vvaa_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ca62cd0401bf761886f087cdb0bcbf6c33f1e80f
--- /dev/null
+++ b/src/gencode/vvaa_m12_m12_generated1.F90
@@ -0,0 +1,815 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m12_m121
+
+end module vvaa_m12_m12_gen1
diff --git a/src/gencode/vvaa_m12_m12_generated2.F90 b/src/gencode/vvaa_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c0a4f707ec077e250736e6bd2cf5e74481946045
--- /dev/null
+++ b/src/gencode/vvaa_m12_m12_generated2.F90
@@ -0,0 +1,1531 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m12_m122
+
+end module vvaa_m12_m12_gen2
diff --git a/src/gencode/vvaa_m12_m12_generated3.F90 b/src/gencode/vvaa_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..37c4751ee7fb6f2f7251e766f344f49ec530a85e
--- /dev/null
+++ b/src/gencode/vvaa_m12_m12_generated3.F90
@@ -0,0 +1,1531 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m12_m123
+
+end module vvaa_m12_m12_gen3
diff --git a/src/gencode/vvaa_m12_m12_generated4.F90 b/src/gencode/vvaa_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f94ffe316471e45a996536f0536fd66250894efe
--- /dev/null
+++ b/src/gencode/vvaa_m12_m12_generated4.F90
@@ -0,0 +1,1264 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-1))
+                allocate(spinandIJ(Nelact-1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-1
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m12_m124
+
+end module vvaa_m12_m12_gen4
diff --git a/src/gencode/vvaa_m20_m20_generated1.F90 b/src/gencode/vvaa_m20_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ff0fd91ddd70379523ed1bcb14a6281f50e2d1fd
--- /dev/null
+++ b/src/gencode/vvaa_m20_m20_generated1.F90
@@ -0,0 +1,434 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m20_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m20_m201( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m20_m201
+
+end module vvaa_m20_m20_gen1
diff --git a/src/gencode/vvaa_m20_m20_generated2.F90 b/src/gencode/vvaa_m20_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1402f7f399def33ec38405a60199abce71d9649f
--- /dev/null
+++ b/src/gencode/vvaa_m20_m20_generated2.F90
@@ -0,0 +1,752 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m20_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m20_m202( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m20_m202
+
+end module vvaa_m20_m20_gen2
diff --git a/src/gencode/vvaa_m20_m20_generated3.F90 b/src/gencode/vvaa_m20_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4a51e5c0cfc049da4a3539ee9293f084e7633374
--- /dev/null
+++ b/src/gencode/vvaa_m20_m20_generated3.F90
@@ -0,0 +1,752 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m20_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m20_m203( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m20_m203
+
+end module vvaa_m20_m20_gen3
diff --git a/src/gencode/vvaa_m20_m20_generated4.F90 b/src/gencode/vvaa_m20_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..56b401a8ce4fd19da6c8886999a32223b539502a
--- /dev/null
+++ b/src/gencode/vvaa_m20_m20_generated4.F90
@@ -0,0 +1,626 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_m20_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_m20_m204( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact-2))
+                allocate(spinandIJ(Nelact-2))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact-2
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p2      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_m20_m204
+
+end module vvaa_m20_m20_gen4
diff --git a/src/gencode/vvaa_p01_p01_generated1.F90 b/src/gencode/vvaa_p01_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..afe3f7aa4668f7638b8ba74eaf136298f72ef501
--- /dev/null
+++ b/src/gencode/vvaa_p01_p01_generated1.F90
@@ -0,0 +1,436 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p01_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p01_p011( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_p01_p011
+
+end module vvaa_p01_p01_gen1
diff --git a/src/gencode/vvaa_p01_p01_generated2.F90 b/src/gencode/vvaa_p01_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fdc6827685aab0ec744865af394bb1dc9714b0ba
--- /dev/null
+++ b/src/gencode/vvaa_p01_p01_generated2.F90
@@ -0,0 +1,542 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p01_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p01_p012( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(nelact  ))
+                allocate(spinandIJ(nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p1      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_p01_p012
+
+end module vvaa_p01_p01_gen2
diff --git a/src/gencode/vvaa_p02_p02_generated1.F90 b/src/gencode/vvaa_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a395c4b153f74462a1707eb5e76287aef941da51
--- /dev/null
+++ b/src/gencode/vvaa_p02_p02_generated1.F90
@@ -0,0 +1,2243 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_p02_p021
+
+end module vvaa_p02_p02_gen1
diff --git a/src/gencode/vvaa_p02_p02_generated2.F90 b/src/gencode/vvaa_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e3473deed33ab1fb68a7ba06aadbc6e7a7140c2d
--- /dev/null
+++ b/src/gencode/vvaa_p02_p02_generated2.F90
@@ -0,0 +1,4492 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_p02_p022
+
+end module vvaa_p02_p02_gen2
diff --git a/src/gencode/vvaa_p02_p02_generated3.F90 b/src/gencode/vvaa_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..737fe784ef3603862f7e4d2a910945b4637080a6
--- /dev/null
+++ b/src/gencode/vvaa_p02_p02_generated3.F90
@@ -0,0 +1,4492 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_p02_p023
+
+end module vvaa_p02_p02_gen3
diff --git a/src/gencode/vvaa_p02_p02_generated4.F90 b/src/gencode/vvaa_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d3b778e48c9ec18de188cec94f5b0587b350ddcf
--- /dev/null
+++ b/src/gencode/vvaa_p02_p02_generated4.F90
@@ -0,0 +1,3706 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p2      ,p4      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p2      ,andIJ(k),p4      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),p4      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact  ))
+                allocate(spinandIJ(Nelact  ))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact  
+                  JK = JK +ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),diffI(1),p1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p2      ,diffJ(1),diffI(1),p2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvaa_p02_p024
+
+end module vvaa_p02_p02_gen4
diff --git a/src/gencode/vvaa_p12_p12_generated1.F90 b/src/gencode/vvaa_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..950f4031c2ea9056d78efeb688e6c3efffe9458c
--- /dev/null
+++ b/src/gencode/vvaa_p12_p12_generated1.F90
@@ -0,0 +1,1096 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_p12_p121
+
+end module vvaa_p12_p12_gen1
diff --git a/src/gencode/vvaa_p12_p12_generated2.F90 b/src/gencode/vvaa_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b5ec2ffc691d76d4db6de24332929a66f997f22a
--- /dev/null
+++ b/src/gencode/vvaa_p12_p12_generated2.F90
@@ -0,0 +1,1451 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvaa_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvaa_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity wrong spin
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                allocate(andIJ(Nelact+1))
+                allocate(spinandIJ(Nelact+1))
+                call extract_orbindx_from_detact(andIJlist, andIJ, spinandIJ,no, nact)
+                do k = 1, Nelact+1
+                  JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,andIJ(k),andIJ(k))&
+                    -delta(-1,spinandIJ(k))*&
+                    ijkl2(twointx,p1      ,andIJ(k),p3      ,andIJ(k))
+                end do
+                deallocate(andIJ)
+                deallocate(spinandIJ)
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl2(twointx,p1      ,diffJ(1),p3      ,diffI(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .lt. idetactI)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl2(twoint,p1      ,p1      ,diffI(1),diffJ(1))&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl2(twointx,p1      ,diffI(1),p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvaa_p12_p122
+
+end module vvaa_p12_p12_gen2
diff --git a/src/gencode/vvao_generated.F90 b/src/gencode/vvao_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e30a97f314df46a5c7262091c818ca61e8d37057
--- /dev/null
+++ b/src/gencode/vvao_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvao_p01_p12_gen1
+  use vvao_p01_p12_gen2
+  use vvao_p01_m11_gen1
+  use vvao_p01_m11_gen2
+  use vvao_p02_m12_gen1
+  use vvao_p02_m12_gen2
+  use vvao_p02_m12_gen3
+  use vvao_p02_m12_gen4
+  use vvao_m12_m20_gen1
+  use vvao_m12_m20_gen2
+  use vvao_m12_m20_gen3
+  use vvao_m12_m20_gen4
+end module vvao_gen
diff --git a/src/gencode/vvao_m12_m20_generated1.F90 b/src/gencode/vvao_m12_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bcb91c227580c699cc6cc580f908f216aee6ac1c
--- /dev/null
+++ b/src/gencode/vvao_m12_m20_generated1.F90
@@ -0,0 +1,1173 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_m12_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_m12_m201( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_m12_m201
+
+end module vvao_m12_m20_gen1
diff --git a/src/gencode/vvao_m12_m20_generated2.F90 b/src/gencode/vvao_m12_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..35a4a846ef6afcff21c659d42bd0eead7a0d38e4
--- /dev/null
+++ b/src/gencode/vvao_m12_m20_generated2.F90
@@ -0,0 +1,1811 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_m12_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_m12_m202( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_m12_m202
+
+end module vvao_m12_m20_gen2
diff --git a/src/gencode/vvao_m12_m20_generated3.F90 b/src/gencode/vvao_m12_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6fa9e34cffb8ded933c11f85010bfd8fa2077496
--- /dev/null
+++ b/src/gencode/vvao_m12_m20_generated3.F90
@@ -0,0 +1,1811 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_m12_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_m12_m203( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_m12_m203
+
+end module vvao_m12_m20_gen3
diff --git a/src/gencode/vvao_m12_m20_generated4.F90 b/src/gencode/vvao_m12_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fb61bc2b7cef0826b1e8010f661e8bfb7fb494c4
--- /dev/null
+++ b/src/gencode/vvao_m12_m20_generated4.F90
@@ -0,0 +1,1254 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_m12_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_m12_m204( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_m12_m204
+
+end module vvao_m12_m20_gen4
diff --git a/src/gencode/vvao_p01_m11_generated1.F90 b/src/gencode/vvao_p01_m11_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4a5c8721e2727001dc49698251aff09943d8142d
--- /dev/null
+++ b/src/gencode/vvao_p01_m11_generated1.F90
@@ -0,0 +1,534 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p01_m11_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p01_m111( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvao_p01_m111
+
+end module vvao_p01_m11_gen1
diff --git a/src/gencode/vvao_p01_m11_generated2.F90 b/src/gencode/vvao_p01_m11_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..89ed8edeacf5a5107bf37139ff149de146a3d5e3
--- /dev/null
+++ b/src/gencode/vvao_p01_m11_generated2.F90
@@ -0,0 +1,532 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p01_m11_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p01_m112( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p3      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvao_p01_m112
+
+end module vvao_p01_m11_gen2
diff --git a/src/gencode/vvao_p01_p12_generated1.F90 b/src/gencode/vvao_p01_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e741644778ed8240ac3c47a65717511721da2c9f
--- /dev/null
+++ b/src/gencode/vvao_p01_p12_generated1.F90
@@ -0,0 +1,1848 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p01_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p01_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 > p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvao_p01_p121
+
+end module vvao_p01_p12_gen1
diff --git a/src/gencode/vvao_p01_p12_generated2.F90 b/src/gencode/vvao_p01_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..99639a0a073773db6d0b4356fd1371659e41683f
--- /dev/null
+++ b/src/gencode/vvao_p01_p12_generated2.F90
@@ -0,0 +1,1846 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p01_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p01_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !U0UU
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !U0DU
+            !spint3 = -1
+            !spint4 = 1
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            !t3 in occD  t4 in ligoU
+            !*** t4 < t1
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            !*** t4 = t1
+            ! t4 = t1 < t3
+            t4 = t1
+            do t3 = isfth+1, isfth+nocc 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   t1-ngel           ,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+            endif !t1 in ligo
+          enddo !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p1      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          !p3 < p1
+          do p3 = p1+1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(11)%exponent, 2)
+            !D0DU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth + 1, isfth+nocc+nligo
+            if (t1 .gt. isfth + nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t1 .le. isfth + nocc) then !t1 in occ
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in occ
+            enddo !t4
+            !D0DD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t1
+            do t4 = isfth + 1, t1-1
+            if (t1 .gt. isfth+nocc) then !t1 in ligo
+            ! t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(7), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t4      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t4      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1 in ligo
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            ! t4 = t1 < t3
+            do t3 = max(t1+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(10), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffJ(1),t3      )&
+                  -delta(-1,spindiffJ(1))*&
+                    ijkl1(twointx,p1      ,diffJ(1),p3      ,t3      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !t3
+          enddo !p3
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvao_p01_p122
+
+end module vvao_p01_p12_gen2
diff --git a/src/gencode/vvao_p02_m12_generated1.F90 b/src/gencode/vvao_p02_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..659fa18adf694e1dff5f883abc7b6266d31125d6
--- /dev/null
+++ b/src/gencode/vvao_p02_m12_generated1.F90
@@ -0,0 +1,4307 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p02_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p02_m121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          !p3<p1<p2<p4
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then
+          p3 = p2
+          !p1<p2=p3<p4
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+          if (p2 .gt. isftp + nligv) then
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in virt
+          enddo !p4
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_p02_m121
+
+end module vvao_p02_m12_gen1
diff --git a/src/gencode/vvao_p02_m12_generated2.F90 b/src/gencode/vvao_p02_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a6ae053c3daf0268893421ac9a73f1fe0562d997
--- /dev/null
+++ b/src/gencode/vvao_p02_m12_generated2.F90
@@ -0,0 +1,6835 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p02_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p02_m122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_p02_m122
+
+end module vvao_p02_m12_gen2
diff --git a/src/gencode/vvao_p02_m12_generated3.F90 b/src/gencode/vvao_p02_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3e0335a4f5931161d0e29051a0d99e7d5d99f95b
--- /dev/null
+++ b/src/gencode/vvao_p02_m12_generated3.F90
@@ -0,0 +1,6835 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p02_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p02_m123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !*** p4 > p2
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = p2+1, isftp + nligv
+          !p1=p3<p2<p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p4
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          !*** p4 > p2
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_p02_m123
+
+end module vvao_p02_m12_gen3
diff --git a/src/gencode/vvao_p02_m12_generated4.F90 b/src/gencode/vvao_p02_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..42f4920d0ea5b9913f1db2aa32e95cd99c5492d5
--- /dev/null
+++ b/src/gencode/vvao_p02_m12_generated4.F90
@@ -0,0 +1,4674 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvao_p02_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvao_p02_m124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUD0
+            !spint3 = -1
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -delta(1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t1      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p1      ,diffI(1),p1      ,t2      )
+                JK = JK +ijkl1(twoint,p2      ,p2      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p2      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1<p3<p4=p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(26)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p3      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            enddo !p3
+          do p4 = p2 + 1, isftp + nligv + nvirt
+          !p1=p3<p2<p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(23)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p2      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p2      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p1<p2=p3<p4
+          p3 = p2
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(29)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t1      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t1      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p4      ,diffI(1),t2      )&
+                  -delta(-1,spindiffI(1))*&
+                    ijkl1(twointx,p4      ,diffI(1),p1      ,t2      )
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          endif !p2 in ligv
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvao_p02_m124
+
+end module vvao_p02_m12_gen4
diff --git a/src/gencode/vvoo_generated.F90 b/src/gencode/vvoo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..25ffa8364dda8c4b6788ad5f0a07a531e6d2f24e
--- /dev/null
+++ b/src/gencode/vvoo_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvoo_p01_p01_gen1
+  use vvoo_p01_p01_gen2
+  use vvoo_p02_p02_gen1
+  use vvoo_p02_p02_gen2
+  use vvoo_p02_p02_gen3
+  use vvoo_p02_p02_gen4
+  use vvoo_p12_p12_gen1
+  use vvoo_p12_p12_gen2
+  use vvoo_m12_m12_gen1
+  use vvoo_m12_m12_gen2
+  use vvoo_m12_m12_gen3
+  use vvoo_m12_m12_gen4
+end module vvoo_gen
diff --git a/src/gencode/vvoo_m12_m12_generated1.F90 b/src/gencode/vvoo_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6fee53971bc5ab515b478c7272625ef63970a234
--- /dev/null
+++ b/src/gencode/vvoo_m12_m12_generated1.F90
@@ -0,0 +1,982 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_m12_m121
+
+end module vvoo_m12_m12_gen1
diff --git a/src/gencode/vvoo_m12_m12_generated2.F90 b/src/gencode/vvoo_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f7a1bbb3ec4e3cd860675e09fcca7045dd18a98f
--- /dev/null
+++ b/src/gencode/vvoo_m12_m12_generated2.F90
@@ -0,0 +1,1689 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_m12_m122
+
+end module vvoo_m12_m12_gen2
diff --git a/src/gencode/vvoo_m12_m12_generated3.F90 b/src/gencode/vvoo_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..e16fdf5f31a757b24dd750303f03d363cdb544fc
--- /dev/null
+++ b/src/gencode/vvoo_m12_m12_generated3.F90
@@ -0,0 +1,1689 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_m12_m123
+
+end module vvoo_m12_m12_gen3
diff --git a/src/gencode/vvoo_m12_m12_generated4.F90 b/src/gencode/vvoo_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..65f0a02d877f7c14355fc79657823762dfa1ebdb
--- /dev/null
+++ b/src/gencode/vvoo_m12_m12_generated4.F90
@@ -0,0 +1,1203 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_m12_m124
+
+end module vvoo_m12_m12_gen4
diff --git a/src/gencode/vvoo_p01_p01_generated1.F90 b/src/gencode/vvoo_p01_p01_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..02452ea8358ea78108214e5919969848a1f7bec7
--- /dev/null
+++ b/src/gencode/vvoo_p01_p01_generated1.F90
@@ -0,0 +1,481 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p01_p01_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p01_p011( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvoo_p01_p011
+
+end module vvoo_p01_p01_gen1
diff --git a/src/gencode/vvoo_p01_p01_generated2.F90 b/src/gencode/vvoo_p01_p01_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7c61347f2eebee21ff6b85ef886f81a04bf7fa68
--- /dev/null
+++ b/src/gencode/vvoo_p01_p01_generated2.F90
@@ -0,0 +1,530 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p01_p01_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p01_p012( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 < t1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 dn
+            !spint3 = -1
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            do t3 = isfth + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !dn t3 < t1
+            !spint3 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 > t1
+            do t3 = t1 + 1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(11), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            do t3 = isfth + 1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(5), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+
+        enddo !i
+      enddo !t1
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvoo_p01_p012
+
+end module vvoo_p01_p01_gen2
diff --git a/src/gencode/vvoo_p02_p02_generated1.F90 b/src/gencode/vvoo_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d27e0c420da947c4e3181e8a3d5ff1a139cc5791
--- /dev/null
+++ b/src/gencode/vvoo_p02_p02_generated1.F90
@@ -0,0 +1,5471 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_p02_p021
+
+end module vvoo_p02_p02_gen1
diff --git a/src/gencode/vvoo_p02_p02_generated2.F90 b/src/gencode/vvoo_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c5086ff6dd7311fab43c62c58d91ccdd45732dc6
--- /dev/null
+++ b/src/gencode/vvoo_p02_p02_generated2.F90
@@ -0,0 +1,10282 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_p02_p022
+
+end module vvoo_p02_p02_gen2
diff --git a/src/gencode/vvoo_p02_p02_generated3.F90 b/src/gencode/vvoo_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..22b5603ba6bbcb75b3506401d75357ce345e7e0e
--- /dev/null
+++ b/src/gencode/vvoo_p02_p02_generated3.F90
@@ -0,0 +1,10282 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          !p1=p3<p2=p4
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_p02_p023
+
+end module vvoo_p02_p02_gen3
diff --git a/src/gencode/vvoo_p02_p02_generated4.F90 b/src/gencode/vvoo_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9083e78f258825e15aeb273ccba4ad88c1eb8542
--- /dev/null
+++ b/src/gencode/vvoo_p02_p02_generated4.F90
@@ -0,0 +1,7514 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t1      )
+                JK = JK -ijkl2(twoint,p2      ,p4      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p2      ,p4      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p4      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t3      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          end do !p3
+          !p1=p3<p2=p4
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(22)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t4      ,t2      )&
+                  -&
+                    ijkl2(twointx,p2      ,t2      ,p2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+                JK = JK +ijkl2(twoint,p2      ,p2      ,t3      ,t1      )&
+                  -&
+                    ijkl2(twointx,p2      ,t1      ,p2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvoo_p02_p024
+
+end module vvoo_p02_p02_gen4
diff --git a/src/gencode/vvoo_p12_p12_generated1.F90 b/src/gencode/vvoo_p12_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2507df5f923ddb95f8c611d913ddab1e2052193e
--- /dev/null
+++ b/src/gencode/vvoo_p12_p12_generated1.F90
@@ -0,0 +1,2378 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p12_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p12_p121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !p1 up
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinp1 = 1
+    !spinpI = -1
+      detshiftpI = dblockI%shiftspinp_array(1) + (p1-isftp-1)*dblockI%deltashiftp_array(1)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          !p3 dn
+          !spinp3 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvoo_p12_p121
+
+end module vvoo_p12_p12_gen1
diff --git a/src/gencode/vvoo_p12_p12_generated2.F90 b/src/gencode/vvoo_p12_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..581b62288b34a80be4d7a98b825bee3564c0d5bc
--- /dev/null
+++ b/src/gencode/vvoo_p12_p12_generated2.F90
@@ -0,0 +1,2882 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvoo_p12_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvoo_p12_p122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist),&
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !p1 dn
+    do p1 = isftp + pmin + 1, isftp + pmax
+    !spinpI = 1
+    !spinp1 = -1
+      detshiftpI = dblockI%shiftspinp_array(2) +(p1-isftp-1)*dblockI%deltashiftp_array(2)
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            !t4 < t3 < t2 < t1
+            do t4 = isfth+1, t2-1
+            if ( t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2 in ligo
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            else ! t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t1 < t3
+            do t3 = isfth+nocc+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 > t2
+            do t4 = t2+1, isfth+nocc+nligo
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+nocc+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t4 < t2
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !*** t4 = t2
+            !t4 = t2 < t3 < t1
+            t4 = t2
+            do t3 =isfth+1, isfth+nocc
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t2 in ligo
+            else !t1 in occ
+            !*** t4 < t2
+            do t4 = isfth+nocc+1, t2-1
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 =isfth+1, t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          !p3 up
+          !spinp3 = +1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            do t4 = isfth+1, isfth+nocc+nligo
+            if (t2 .gt. isfth+nocc) then!t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !t3 in occD  t4 in ligoU
+            do t4 = isfth+nocc+1, isfth+nocc+nligo
+            if (t2 .le. isfth+nocc) then !t2 in occ
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            enddo !t4
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+          enddo !p3
+          !p3 dn
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1-1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(5)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t1      ,t1      )&
+                  +&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t1      )
+                JK = JK -ijkl2(twoint,p1      ,p3      ,t2      ,t2      )&
+                  +&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !t4 = t2 < t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(23), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+            !*** t2 < t4 < t1
+            do t4 = t2+1, t1-1
+            !t2 < t4 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(26), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t1
+            t4 = t1
+            !t2 < t4 = t1 < t3
+            do t3 = t1+1, isfth+nocc+nligo 
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(29), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,t2      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p3      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+          enddo !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(9)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 < t2
+            do t4 = isfth+1, t2-1
+            if (t2 .gt. isfth+nocc) then !t2 in ligo
+            !t4 < t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(16), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t2
+            !t4 < t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(18), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t2      ,t4      )&
+                  -&
+                    ijkl2(twointx,p1      ,t2      ,p1      ,t4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t4
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 < t1
+            do t3 = max(t2+1,isfth+nocc+1), t1-1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(21), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,t1      ,t3      )&
+                  -&
+                    ijkl2(twointx,p1      ,t1      ,p1      ,t3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !t3
+        enddo !i
+        enddo !t1
+      enddo !t2
+    enddo !p1
+    !$OMP END DO
+    !$OMP END PARALLEL
+  end subroutine hv_blocs_vvoo_p12_p122
+
+end module vvoo_p12_p12_gen2
diff --git a/src/gencode/vvva_generated.F90 b/src/gencode/vvva_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f8827e4f2928631ade275359cc879a54d39d4b92
--- /dev/null
+++ b/src/gencode/vvva_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvva_p01_m12_gen1
+  use vvva_p01_m12_gen2
+  use vvva_p01_m12_gen3
+  use vvva_p01_m12_gen4
+  use vvva_p02_p12_gen1
+  use vvva_p02_p12_gen2
+  use vvva_p02_p12_gen3
+  use vvva_p02_p12_gen4
+  use vvva_m11_m20_gen1
+  use vvva_m11_m20_gen2
+  use vvva_m11_m20_gen3
+  use vvva_m11_m20_gen4
+end module vvva_gen
diff --git a/src/gencode/vvva_m11_m20_generated1.F90 b/src/gencode/vvva_m11_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c43759e0b73c09537cef0ea3a70a20eaaec1cf2b
--- /dev/null
+++ b/src/gencode/vvva_m11_m20_generated1.F90
@@ -0,0 +1,419 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_m11_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_m11_m201( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_m11_m201
+
+end module vvva_m11_m20_gen1
diff --git a/src/gencode/vvva_m11_m20_generated2.F90 b/src/gencode/vvva_m11_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..755ffd0c68b60b031b0d68295f49c429319d6c84
--- /dev/null
+++ b/src/gencode/vvva_m11_m20_generated2.F90
@@ -0,0 +1,413 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_m11_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_m11_m202( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_m11_m202
+
+end module vvva_m11_m20_gen2
diff --git a/src/gencode/vvva_m11_m20_generated3.F90 b/src/gencode/vvva_m11_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3fabe4d979359ec721aa631816039c20308330ae
--- /dev/null
+++ b/src/gencode/vvva_m11_m20_generated3.F90
@@ -0,0 +1,413 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_m11_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_m11_m203( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_m11_m203
+
+end module vvva_m11_m20_gen3
diff --git a/src/gencode/vvva_m11_m20_generated4.F90 b/src/gencode/vvva_m11_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..49dabafcccbe2380e6998bf6dd3c267b348fb22e
--- /dev/null
+++ b/src/gencode/vvva_m11_m20_generated4.F90
@@ -0,0 +1,419 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_m11_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_m11_m204( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_m11_m204
+
+end module vvva_m11_m20_gen4
diff --git a/src/gencode/vvva_p01_m12_generated1.F90 b/src/gencode/vvva_p01_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d073ae350d9bcc7692b6a7ab3269c5a0f27ff169
--- /dev/null
+++ b/src/gencode/vvva_p01_m12_generated1.F90
@@ -0,0 +1,817 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p01_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p01_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p01_m121
+
+end module vvva_p01_m12_gen1
diff --git a/src/gencode/vvva_p01_m12_generated2.F90 b/src/gencode/vvva_p01_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..299b2b8187a0c71d13b37135f9702a1a02fa8dc2
--- /dev/null
+++ b/src/gencode/vvva_p01_m12_generated2.F90
@@ -0,0 +1,805 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p01_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p01_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p01_m122
+
+end module vvva_p01_m12_gen2
diff --git a/src/gencode/vvva_p01_m12_generated3.F90 b/src/gencode/vvva_p01_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a425aeca1404b1a027b23019dfef706e2c760816
--- /dev/null
+++ b/src/gencode/vvva_p01_m12_generated3.F90
@@ -0,0 +1,805 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p01_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p01_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p01_m123
+
+end module vvva_p01_m12_gen3
diff --git a/src/gencode/vvva_p01_m12_generated4.F90 b/src/gencode/vvva_p01_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4dd56e8829816fca9a1e98dda1c2bdf7356d7704
--- /dev/null
+++ b/src/gencode/vvva_p01_m12_generated4.F90
@@ -0,0 +1,818 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p01_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p01_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+                endif
+              enddo !jpos
+
+          end do !p3
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p01_m124
+
+end module vvva_p01_m12_gen4
diff --git a/src/gencode/vvva_p02_p12_generated1.F90 b/src/gencode/vvva_p02_p12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..77624bc01e775a72e115fe9088f6a10d786632de
--- /dev/null
+++ b/src/gencode/vvva_p02_p12_generated1.F90
@@ -0,0 +1,2351 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p02_p12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p02_p121( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p02_p121
+
+end module vvva_p02_p12_gen1
diff --git a/src/gencode/vvva_p02_p12_generated2.F90 b/src/gencode/vvva_p02_p12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..841f0c6425878b92f50454259d6e826caea36fd5
--- /dev/null
+++ b/src/gencode/vvva_p02_p12_generated2.F90
@@ -0,0 +1,2313 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p02_p12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p02_p122( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p02_p122
+
+end module vvva_p02_p12_gen2
diff --git a/src/gencode/vvva_p02_p12_generated3.F90 b/src/gencode/vvva_p02_p12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9f2f70d2cbed3838d75d62c3bb28d001f2c908ee
--- /dev/null
+++ b/src/gencode/vvva_p02_p12_generated3.F90
@@ -0,0 +1,2313 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p02_p12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p02_p123( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p02_p123
+
+end module vvva_p02_p12_gen3
diff --git a/src/gencode/vvva_p02_p12_generated4.F90 b/src/gencode/vvva_p02_p12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c964a8f68d62da9b29c9d81fb5575573cb7ec27c
--- /dev/null
+++ b/src/gencode/vvva_p02_p12_generated4.F90
@@ -0,0 +1,2354 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvva_p02_p12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvva_p02_p124( &
+              VmI, VmJ, spinrefI, dblockI, tmpWmI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK 
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =1
+
+              !CM1
+              call CM1_spindetact_list(spinrefI, spinrefJ, idetactI, nact, &
+                   nCM1, detCM1, detCM1orb)
+              do jpos = 1,nCM1
+                idetactJ = detCM1(jpos)
+                if ((idetactJ .ge. isftJ +1) .and. &
+                     (idetactJ .le. isftJ + ndetactJ)) then
+                j = idetactJ - isftJ
+                JK = 0.d0
+                call extract_detCMorb(detCM1orb(jpos)%p,diffi, diffj, spindiffi, spindiffj, sign_act, &
+                     Ndiffact_I, Ndiffact_J)
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,diffJ(1))&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,diffJ(1))
+                elm = sign_act * psign * (1 - 2*modulo((Nh_I*Ndiffact_I + Nh_J*Ndiffact_J),2)) * &
+                     tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                  enddo !m
+
+                  do m = 1, nvec
+                    tmpWmI(m, detshiftI + i) = &
+                         tmpWmI(m, detshiftI + i) + &
+                         elm*VmJ%elms(m, detshiftJ + j)
+                  enddo !m
+
+                endif
+              enddo !jpos
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvva_p02_p124
+
+end module vvva_p02_p12_gen4
diff --git a/src/gencode/vvvo_generated.F90 b/src/gencode/vvvo_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b00ac2eb9809128a562b1b2e30b0fb8bcf04869b
--- /dev/null
+++ b/src/gencode/vvvo_generated.F90
@@ -0,0 +1,48 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvvo_p01_p02_gen1
+  use vvvo_p01_p02_gen2
+  use vvvo_p01_p02_gen3
+  use vvvo_p01_p02_gen4
+  use vvvo_m11_m12_gen1
+  use vvvo_m11_m12_gen2
+  use vvvo_m11_m12_gen3
+  use vvvo_m11_m12_gen4
+end module vvvo_gen
diff --git a/src/gencode/vvvo_m11_m12_generated1.F90 b/src/gencode/vvvo_m11_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..4aac79a0f6f3d6f36d79f4b2a4cdfd176ffa1d64
--- /dev/null
+++ b/src/gencode/vvvo_m11_m12_generated1.F90
@@ -0,0 +1,393 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_m11_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_m11_m121( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_m11_m121
+
+end module vvvo_m11_m12_gen1
diff --git a/src/gencode/vvvo_m11_m12_generated2.F90 b/src/gencode/vvvo_m11_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8a8703f4680a1b1387fe500d33f0cd72577945c7
--- /dev/null
+++ b/src/gencode/vvvo_m11_m12_generated2.F90
@@ -0,0 +1,419 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_m11_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_m11_m122( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do !p3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_m11_m122
+
+end module vvvo_m11_m12_gen2
diff --git a/src/gencode/vvvo_m11_m12_generated3.F90 b/src/gencode/vvvo_m11_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f308c814cc45fe1ab19aa764fdbb1b1bb1b7442d
--- /dev/null
+++ b/src/gencode/vvvo_m11_m12_generated3.F90
@@ -0,0 +1,419 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_m11_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_m11_m123( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   t1-ngel           ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do !p3
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_m11_m123
+
+end module vvvo_m11_m12_gen3
diff --git a/src/gencode/vvvo_m11_m12_generated4.F90 b/src/gencode/vvvo_m11_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..944822be258ca85764d00145100c63b006b08953
--- /dev/null
+++ b/src/gencode/vvvo_m11_m12_generated4.F90
@@ -0,0 +1,394 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_m11_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_m11_m124( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(4), &
+                   nocc+nligo+t1-ngel,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_m11_m124
+
+end module vvvo_m11_m12_gen4
diff --git a/src/gencode/vvvo_p01_p02_generated1.F90 b/src/gencode/vvvo_p01_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b2388489ba3dfc69d98f8e22d3b7bd159b2d6734
--- /dev/null
+++ b/src/gencode/vvvo_p01_p02_generated1.F90
@@ -0,0 +1,1163 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_p01_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_p01_p021( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UUU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          ! p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          ! UUD0
+          !spinp3 = -1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_p01_p021
+
+end module vvvo_p01_p02_gen1
diff --git a/src/gencode/vvvo_p01_p02_generated2.F90 b/src/gencode/vvvo_p01_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6f0f9165c8ab72b1dc91127eb13f99de25871c7c
--- /dev/null
+++ b/src/gencode/vvvo_p01_p02_generated2.F90
@@ -0,0 +1,1275 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_p01_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_p01_p022( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_p01_p022
+
+end module vvvo_p01_p02_gen2
diff --git a/src/gencode/vvvo_p01_p02_generated3.F90 b/src/gencode/vvvo_p01_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..0c25ac82a3a0518f28c7b616b7169d5ec1cadb47
--- /dev/null
+++ b/src/gencode/vvvo_p01_p02_generated3.F90
@@ -0,0 +1,1275 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_p01_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_p01_p023( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !UUD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK &
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! UDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p1
+          do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          ! UDD0
+          !spinp3 = -1
+          !p3 < p2
+          do p3 = isftp + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_p01_p023
+
+end module vvvo_p01_p02_gen3
diff --git a/src/gencode/vvvo_p01_p02_generated4.F90 b/src/gencode/vvvo_p01_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b91c7ef4f7ceab77d412cd93fc517fe02b0234a4
--- /dev/null
+++ b/src/gencode/vvvo_p01_p02_generated4.F90
@@ -0,0 +1,1166 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvo_p01_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvo_p01_p024( &
+              VmI, VmJ, spinrefJ, dblockJ, tmpWmI, tmpWmJ, nvec, spinrefI, dblockI, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI, VmJ
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmI, tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI, VmJ), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmI, tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmI) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !UUU0
+            !spint3 = 1
+            !UUD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DUU0
+            !spint3 = 1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !DUD0
+            !spint3 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          detshiftJ = 0
+          ! DDU0
+          !spinp3 = 1
+          !p3 < p1
+          do p3 = isftp + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(1) +(p3-isftp-1)*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+          end do !p3
+          ! DDD0
+          !spinp3 = -1
+          !p3 < p1
+          do p3 = isftp + 1, p1 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(14)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p1
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(20)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p1      ,p1      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p1      ,p2      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p1 < p3 < p2
+          do p3 = p1 + 1, p2 - 1
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(24)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+          !p3 = p2
+          p3 = p2
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(28)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl1(twoint,p2      ,p2      ,p1      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p1      ,p2      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          !p3 > p2
+          do p3 = p2 + 1, isftp + nligv + nvirt
+          detshiftpJ = dblockJ%shiftspinp_array(2) +(p3-isftp-1)*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(30)%exponent, 2)
+            !DDU0
+            !spint3 = 1
+            !DDD0
+            !spint3 = -1
+            !t3 = t2 < t1
+            t3 = t2
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(20), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t1      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t1      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+            !t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(28), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl1(twoint,p1      ,p3      ,p2      ,t2      )&
+                  -&
+                    ijkl1(twoint,p2      ,p3      ,p1      ,t2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                tmpWmJ(m, detshiftI + i) = &
+                     tmpWmJ(m, detshiftI + i) + &
+                     elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+                  do m = 1, nvec
+                tmpWmI(m, detshiftJ + j) = &
+                     tmpWmI(m, detshiftJ + j) + &
+                     elm*VmJ%elms(m, detshiftI + i)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvo_p01_p024
+
+end module vvvo_p01_p02_gen4
diff --git a/src/gencode/vvvv_generated.F90 b/src/gencode/vvvv_generated.F90
new file mode 100644
index 0000000000000000000000000000000000000000..f6bf7c5cb82c7bc99c70cfc461e9e5e7a08c5592
--- /dev/null
+++ b/src/gencode/vvvv_generated.F90
@@ -0,0 +1,52 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_gen
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+  use vvvv_p02_p02_gen1
+  use vvvv_p02_p02_gen2
+  use vvvv_p02_p02_gen3
+  use vvvv_p02_p02_gen4
+  use vvvv_m12_m12_gen1
+  use vvvv_m12_m12_gen2
+  use vvvv_m12_m12_gen3
+  use vvvv_m12_m12_gen4
+  use vvvv_m20_m20_gen1
+  use vvvv_m20_m20_gen2
+  use vvvv_m20_m20_gen3
+  use vvvv_m20_m20_gen4
+end module vvvv_gen
diff --git a/src/gencode/vvvv_m12_m12_generated1.F90 b/src/gencode/vvvv_m12_m12_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..67a51f0ac0efe4bd8cf2f9e1c58f38894eef1408
--- /dev/null
+++ b/src/gencode/vvvv_m12_m12_generated1.F90
@@ -0,0 +1,751 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m12_m12_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m12_m121( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(1)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(1)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(2)
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(2)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m12_m121
+
+end module vvvv_m12_m12_gen1
diff --git a/src/gencode/vvvv_m12_m12_generated2.F90 b/src/gencode/vvvv_m12_m12_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..eee25d025cfe29f18e1ae9f004f20fb5386417f9
--- /dev/null
+++ b/src/gencode/vvvv_m12_m12_generated2.F90
@@ -0,0 +1,1351 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m12_m12_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m12_m122( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(3)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(4)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m12_m122
+
+end module vvvv_m12_m12_gen2
diff --git a/src/gencode/vvvv_m12_m12_generated3.F90 b/src/gencode/vvvv_m12_m12_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c60f332ea6d7474babb0b71034e0ad7be74dc97c
--- /dev/null
+++ b/src/gencode/vvvv_m12_m12_generated3.F90
@@ -0,0 +1,1351 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m12_m12_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m12_m123( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(5)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(3)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(5)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(6)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(4)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(6)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+      enddo !t1
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m12_m123
+
+end module vvvv_m12_m12_gen3
diff --git a/src/gencode/vvvv_m12_m12_generated4.F90 b/src/gencode/vvvv_m12_m12_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..46346896be5f161679b5ba073e959b501f38f3c2
--- /dev/null
+++ b/src/gencode/vvvv_m12_m12_generated4.F90
@@ -0,0 +1,952 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m12_m12_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m12_m124( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1
+    integer :: p3, p4
+    integer :: t3
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !t1 up
+      do t1 = isfth + 1, isfth+nocc+nligo
+      !spint1 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(7)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(7)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   t1-ngel           ,0                 ,t3-ngel           ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            !t3 dn
+            !spint3 = -1
+          end do !p3
+        enddo !i
+      enddo !t1
+
+      !t1 dn
+      do t1 = isfth + 1, isfth+nocc+nligo
+        !spint1 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (t1-isfth-1) * dblockI%deltashifth_array(8)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !t3 up
+            !spint3 = 1
+            !dn t3 < t1
+            !spint3 = -1
+            !t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (t3-isfth-1) * dblockJ%deltashifth_array(8)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(9), &
+                   nocc+nligo+t1-ngel,0                 ,nocc+nligo+t3-ngel,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+
+          end do !p3
+        enddo !i
+      enddo !t1
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m12_m124
+
+end module vvvv_m12_m12_gen4
diff --git a/src/gencode/vvvv_m20_m20_generated1.F90 b/src/gencode/vvvv_m20_m20_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..88ef5541f25c4cf900451e4b41d733fcd8878aa3
--- /dev/null
+++ b/src/gencode/vvvv_m20_m20_generated1.F90
@@ -0,0 +1,386 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m20_m20_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m20_m201( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      detshiftI = detshiftpI
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m20_m201
+
+end module vvvv_m20_m20_gen1
diff --git a/src/gencode/vvvv_m20_m20_generated2.F90 b/src/gencode/vvvv_m20_m20_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b69abab517fa6d5ec9de8cfb13e9360445c6ca40
--- /dev/null
+++ b/src/gencode/vvvv_m20_m20_generated2.F90
@@ -0,0 +1,622 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m20_m20_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m20_m202( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            enddo !p3
+          enddo !p4
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m20_m202
+
+end module vvvv_m20_m20_gen2
diff --git a/src/gencode/vvvv_m20_m20_generated3.F90 b/src/gencode/vvvv_m20_m20_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..2db1697585bd37e682021977343e99d7172c7823
--- /dev/null
+++ b/src/gencode/vvvv_m20_m20_generated3.F90
@@ -0,0 +1,622 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m20_m20_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m20_m203( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      detshiftI = detshiftpI
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            enddo !p3
+          enddo !p4
+        enddo !i
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m20_m203
+
+end module vvvv_m20_m20_gen3
diff --git a/src/gencode/vvvv_m20_m20_generated4.F90 b/src/gencode/vvvv_m20_m20_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..52b2fd738da705d50399a0104b2e249b7c1c9a12
--- /dev/null
+++ b/src/gencode/vvvv_m20_m20_generated4.F90
@@ -0,0 +1,450 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_m20_m20_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_m20_m204( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: p3, p4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      detshiftI = detshiftpI
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            detshiftJ = detshiftpJ
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(1), &
+                   0                 ,0                 ,0                 ,0                 )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_m20_m204
+
+end module vvvv_m20_m20_gen4
diff --git a/src/gencode/vvvv_p02_p02_generated1.F90 b/src/gencode/vvvv_p02_p02_generated1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c615a4a88e446aa87451e1bb1e1268fc30e992ef
--- /dev/null
+++ b/src/gencode/vvvv_p02_p02_generated1.F90
@@ -0,0 +1,2103 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_p02_p02_gen1
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_p02_p021( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !UU
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+      detshiftpI = dblockI%shiftspinp_array(1) &
+           + (dblockI%shiftp_array(p2-isftp) + (p1-isftp-1))*dblockI%deltashiftp_array(1)
+        !spinp1 = 1
+        !spinp2 = 1
+        !spinpI = -2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(1) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(1)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(1) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(1)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(2) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(2)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(3) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(3)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(2) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(2)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(3) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(3)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(4) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(4)
+        !indxI = 5
+        isftI = spinrefI%ShiftSpinCat(5)
+        ndetactI = spinrefI%NdetSpinCat(5)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !UUUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !*** p1 < p4 < p2
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2-1
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(4) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(4)
+              !indxJ = 5
+              isftJ = spinrefJ%ShiftSpinCat(5)
+              ndetactJ = spinrefJ%NdetSpinCat(5)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          !spinp3 = -1
+          !spinp4 = -1
+          !UUDD
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_p02_p021
+
+end module vvvv_p02_p02_gen1
diff --git a/src/gencode/vvvv_p02_p02_generated2.F90 b/src/gencode/vvvv_p02_p02_generated2.F90
new file mode 100644
index 0000000000000000000000000000000000000000..d138b6d972140989ff3e03d355b719c7aa16b117
--- /dev/null
+++ b/src/gencode/vvvv_p02_p02_generated2.F90
@@ -0,0 +1,4082 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_p02_p02_gen2
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_p02_p022( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in ligvU and p2 in ligvD+virtD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, isftp + nligv
+      detshiftpI = dblockI%shiftspinp_array(2) &
+          +((p2-isftp-1)*nligv + (p1-isftp-1))*dblockI%deltashiftp_array(2)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(5) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(5)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(6) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(6)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(7) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(7)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(8) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(8)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_p02_p022
+
+end module vvvv_p02_p02_gen2
diff --git a/src/gencode/vvvv_p02_p02_generated3.F90 b/src/gencode/vvvv_p02_p02_generated3.F90
new file mode 100644
index 0000000000000000000000000000000000000000..67b54d504da04a272d4fae05d34ecee53bcdfc2e
--- /dev/null
+++ b/src/gencode/vvvv_p02_p02_generated3.F90
@@ -0,0 +1,4082 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_p02_p02_gen3
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_p02_p023( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+    !UD
+    !Case p1 in virtU and p2 in ligvD
+      do p1 = isftp + max(nligv, pmin) + 1, isftp + pmax
+    do p2 = isftp + 1, isftp + nligv 
+      detshiftpI = dblockI%shiftspinp_array(3) &
+          +((p2-isftp-1)*nvirt + (p1-isftp-nligv-1))*dblockI%deltashiftp_array(3)
+        !spinp1 = 1
+        !spinp2 = -1
+        !spinpI = 0
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(9) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(9)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(5) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(5)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(9) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(9)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(10) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(10)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(11) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(11)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(6) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(6)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(7) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(7)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(10) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(10)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(11) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(11)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(12) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(12)
+        !indxI = 3
+        isftI = spinrefI%ShiftSpinCat(3)
+        ndetactI = spinrefI%NdetSpinCat(3)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !spinp3 = 1
+          !spinp4 = 1
+          !UDUU
+          !*** p4 < p1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 -1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !*** p4 = p1
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !*** p1 < p4 < p2
+          do p4 = p1 + 1, isftp + nligv + nvirt
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          if( p1 .le. isftp + nligv) then
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+            endif !p1 in ligv
+          enddo !p4
+          !UDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( p1 .le. isftp + nligv) then
+          !*** p4 < p2
+          do p4 =  isftp + 1, p2-1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+            do p3 = p1 + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          ! *** p4 < p2
+          !p1<p3<p4<p2
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 = isftp + 1, min(p2 -1, isftp + nligv)
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          endif !p2 in ligv
+          else !Case p1 in virtU and p2 in ligvD
+          !*** p4 < p2
+          !p3<p1<p4<p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          do p4 = isftp + 1, p2-1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !p3<p1<p4=p2
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(8) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(8)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+          !*** p4 < p2
+          !Case p1 in virtU and p2 in ligvD
+          !Case p3 in virtU and p4 in ligvD
+          do p4 =  isftp + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+          !Case p3 in virtU and p4 in ligvD
+            do p3 = p1 + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !*** p4 = p2
+          !Case p3 in virtU and p4 in ligvD
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + nligv + 1, p1 - 1
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(12) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(12)
+              !indxJ = 3
+              isftJ = spinrefJ%ShiftSpinCat(3)
+              ndetactJ = spinrefJ%NdetSpinCat(3)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          endif !p1
+          !UDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p1<p3<p4<p2
+          do p4 = isftp + 1, p2 -1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+        enddo !i
+        enddo !t1
+      enddo !t2
+      end do !p1
+    end do !p2
+    !$OMP END DO
+
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_p02_p023
+
+end module vvvv_p02_p02_gen3
diff --git a/src/gencode/vvvv_p02_p02_generated4.F90 b/src/gencode/vvvv_p02_p02_generated4.F90
new file mode 100644
index 0000000000000000000000000000000000000000..32e6df3005cdba3ca3ef973878640aa6082971d9
--- /dev/null
+++ b/src/gencode/vvvv_p02_p02_generated4.F90
@@ -0,0 +1,2839 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+module vvvv_p02_p02_gen4
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use utils_intcase
+  use hole_part_cases
+
+  implicit none
+
+contains
+
+  subroutine hv_blocs_vvvv_p02_p024( &
+              VmI, spinrefI, dblockI, tmpWmJ, nvec, spinrefJ, dblockJ, o_info, &
+              nelact, hcase_info, pcase_info, &
+              pmin, pmax, twoint, twointx)
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(spindetact_list), pointer, intent(in) :: spinrefI, spinrefJ
+    type(vecMblock), pointer, intent(in)       :: VmI
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: tmpWmJ
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nvec, nelact, pmin, pmax
+    type(case_infotype), intent(in)            :: hcase_info(:), pcase_info(:)
+    type(intblock), intent(in)                 :: twoint, twointx
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, no
+    integer :: isftp, isfth
+    integer :: isftI, ndetactI, idetactI
+    integer :: isftJ, ndetactJ, idetactJ
+    integer(kindact) :: detactI, detactJ
+    integer :: i, j, k, jpos, m
+    integer :: p1, p2
+    integer :: t1, t2
+    integer :: p3, p4
+    integer :: t3, t4
+    integer :: detshiftpI, detshiftI
+    integer :: detshiftpJ, detshiftJ
+
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    integer(kindact) :: diffilist, diffjlist, andijlist
+    integer :: psign, tsign, sign_act
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable :: andIJ(:), spinandIJ(:)
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    real(kd_dble) :: JK, elm
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+    isftp = (ngel+nocc+nligo+nact)
+    isfth = ngel
+
+    detshiftpI = 0
+    detshiftI = 0
+    detshiftpJ = 0
+    detshiftJ = 0
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+    !$OMP PARALLEL DEFAULT(NONE) &
+    !$OMP& SHARED(dblockI, spinrefI, pcase_info, hcase_info), &
+    !$OMP& SHARED(dblockJ, spinrefJ, nelact, nvec, VmI), &
+    !$OMP& SHARED(ngel, nocc, nligo, nact, nligv, nvirt, ntot), &
+    !$OMP& SHARED(no, isftp, isfth, Nh_I, Nh_J, pmin, pmax), &
+    !$OMP& SHARED(twoint, twointx), &
+    !$OMP& SHARED(tmpWmJ), &
+    !$OMP& PRIVATE(p1, p2), &
+    !$OMP& PRIVATE(t1, t2), &
+    !$OMP& PRIVATE(p3, p4), &
+    !$OMP& PRIVATE(t3, t4), &
+    !$OMP& PRIVATE(isftI, ndetactI, isftJ, ndetactJ), &
+    !$OMP& PRIVATE(i, j, k, jpos, m), &
+    !$OMP& PRIVATE(Ndiffact_I, Ndiffact_J, diffilist, diffjlist, andijlist), &
+    !$OMP& PRIVATE(psign, tsign, sign_act, diffi, diffj, spindiffi, spindiffj), &
+    !$OMP& PRIVATE(andIJ, spinandIJ, nCM1, nCM2, detCM1, detCM2, detCM1orb, detCM2orb, JK, elm), & 
+    !$OMP& PRIVATE(idetactI, idetactJ, detactI, detactJ), &
+    !$OMP& FIRSTPRIVATE(detshiftI, detshiftpI, detshiftJ, detshiftpJ)
+    !$OMP DO SCHEDULE(RUNTIME) reduction(+:tmpWmJ)
+
+    !DD
+    do p2 = isftp + pmin + 1, isftp + pmax
+      do p1 = isftp + 1, min(p2-1, isftp + nligv)
+        !spinp1 = -1
+        !spinp2 = -1
+      detshiftpI = dblockI%shiftspinp_array(4) &
+          + (dblockI%shiftp_array(p2-isftp)+ (p1-isftp-1))*dblockI%deltashiftp_array(4)
+        !spinpI = +2
+      !UU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(13) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(13)
+          !spint1 = +1
+          !spint2 = +1
+        !indxI = 4
+        isftI = spinrefI%ShiftSpinCat(4)
+        ndetactI = spinrefI%NdetSpinCat(4)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(13) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(13)
+              !indxJ = 4
+              isftJ = spinrefJ%ShiftSpinCat(4)
+              ndetactJ = spinrefJ%NdetSpinCat(4)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   t1-ngel           ,t2-ngel           ,t3-ngel           ,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            !UUDU
+            !spint3 = -1
+            !spint4 = 1
+            !t3 in ligoD t4 in occU+ligoU
+            !t3 in occD  t4 in ligoU
+            !UUDD
+            !spint3 = -1
+            !spint4 = -1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(14) + &
+               ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+               dblockI%deltashifth_array(14)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DU
+        do t1 = isfth + 1, isfth + nocc
+      do t2 = isfth + nocc + 1, isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = +1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(15) + &
+               ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+               dblockI%deltashifth_array(15)
+        !indxI = 2
+        isftI = spinrefI%ShiftSpinCat(2)
+        ndetactI = spinrefI%NdetSpinCat(2)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !spint3 = 1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            else ! t1 in occ
+            endif !t1
+            !DUDU
+            !spint3 = -1
+            !spint4 = 1
+            if ( t1 .gt. isfth+nocc) then !t1 in ligo
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(14) + &
+               ((t4-isfth-1)*nligo + t3 - (isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(14)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            else !t1 in occ
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(15) + &
+               ((t4-isfth-nocc-1)*nocc + t3 - (isfth+1)) * &
+               dblockJ%deltashifth_array(15)
+              !indxJ = 2
+              isftJ = spinrefJ%ShiftSpinCat(2)
+              ndetactJ = spinrefJ%NdetSpinCat(2)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,t2-ngel           ,nocc+nligo+t3-ngel,t4-ngel           )
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            endif !t1
+            !DUDD
+            !spint3 = -1
+            !spint4 = -1
+            if ( t1 .gt.isfth+nocc) then !t1 in ligo
+            else !t1 in occ
+            endif !t1
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+
+      !DD
+      do t2 = isfth + 1, isfth+nocc+nligo
+        do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !spint1 = -1
+          !spint2 = -1
+          detshiftI = detshiftpI + dblockI%shiftspinh_array(16) + &
+               (dblockI%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+               dblockI%deltashifth_array(16)
+        !indxI = 1
+        isftI = spinrefI%ShiftSpinCat(1)
+        ndetactI = spinrefI%NdetSpinCat(1)
+        do i = 1, ndetactI
+          idetactI = isftI+i
+          detactI = spinrefI%elms(idetactI)
+          !DDUU
+          !spinp3 = 1
+          !spinp4 = 1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+            do p3 = isftp + 1, min(p4-1, isftp + nligv)
+          detshiftpJ = dblockJ%shiftspinp_array(1) &
+                + (dblockJ%shiftp_array(p4-isftp) + (p3-isftp-1))*dblockJ%deltashiftp_array(1)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          end do !p4
+          !DDUD
+          !spinp3 = 1
+          !spinp4 = -1
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, p2 -1
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + 1, isftp + nligv
+          detshiftpJ =  dblockJ%shiftspinp_array(2) &
+               +((p4-isftp-1)*nligv + (p3-isftp-1))*dblockJ%deltashiftp_array(2)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !Case p3 in virtU and p4 in ligvD
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          !p3<p1<p4<p2
+          do p4 = p1 + 1, min(p2 - 1, isftp + nligv) 
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          enddo !p4
+          if (p2 .le. isftp + nligv) then !p2 in ligv
+          !p3<p1<p4=p2
+          p4 = p2
+            do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+          detshiftpJ =  dblockJ%shiftspinp_array(3) &
+               +((p4-isftp-1)*nvirt + (p3-isftp-nligv-1))*dblockJ%deltashiftp_array(3)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            end do !p3
+          endif !p2 in ligv
+          !DDDD
+          !spinp3 = -1
+          !spinp4 = -1
+          !p3<p4<p1<p2
+          do p4 = isftp + 1, p1 - 1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(15)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          end do !p4
+          !p3<p4=p1<p2
+          p4 = p1
+            do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(16)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p3      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          do p4 = p1 + 1, p2-1
+          !p3<p1<p4<p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(17)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            end do !p3
+          !p3=p1<p4<p2
+          p3 = p1
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(21)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p1      ,p1      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p2      ,p1      ,p4      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          !p1<p3<p4<p2
+            do p3 = p1 + 1, min(p4 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(25)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +&
+                  ijkl2(twoint,p1      ,p3      ,p2      ,p4      )&
+                  -&
+                    ijkl2(twoint,p1      ,p4      ,p3      ,p2      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+            enddo !p3
+          enddo !p4
+          p4 = p2
+          !p3<p1<p4=p2
+            do p3 = isftp + 1, min(p1 - 1, isftp + nligv)
+          detshiftpJ =  dblockJ%shiftspinp_array(4) &
+               + (dblockJ%shiftp_array(p4-isftp)+ (p3-isftp-1))*dblockJ%deltashiftp_array(4)
+          psign = 1 - 2 * modulo(pcase_info(18)%exponent, 2)
+            !DDUU
+            !spint3 = 1
+            !spint4 = 1
+            !DDDU
+            !spint3 = -1
+            !spint4 = 1
+            !DDDD
+            !spint3 = -1
+            !spint4 = -1
+            !*** t4 = t2
+            t4 = t2
+            !t4 = t2 < t3 = t1
+            t3 = t1
+          detshiftJ = detshiftpJ + dblockJ%shiftspinh_array(16) + &
+               (dblockJ%shifth_array(t4-isfth) + t3 -  max(t4+1,isfth+nocc+1)) * &
+               dblockJ%deltashifth_array(16)
+              !indxJ = 1
+              isftJ = spinrefJ%ShiftSpinCat(1)
+              ndetactJ = spinrefJ%NdetSpinCat(1)
+
+              tsign = calc_hole_sign(hcase_info(22), &
+                   nocc+nligo+t1-ngel,nocc+nligo+t2-ngel,nocc+nligo+t3-ngel,nocc+nligo+t4-ngel)
+
+              !actcase =0
+
+              !Identity
+              j = i
+              idetactJ = isftJ + j
+              detactJ = spinrefJ%elms(idetactJ)
+              call sign_diff(detactI, detactJ,diffilist, diffjlist, andijlist, sign_act, nact)
+              JK = 0.d0
+                JK = JK +ijkl2(twoint,p2      ,p2      ,p1      ,p3      )&
+                  -&
+                    ijkl2(twoint,p2      ,p1      ,p2      ,p3      )
+              elm = psign * tsign * JK
+
+                  do m = 1, nvec
+                    tmpWmJ(m, detshiftJ + j) = &
+                         tmpWmJ(m, detshiftJ + j) + &
+                         elm*VmI%elms(m, detshiftI + i)
+                    !Add the symmetric W_i += H_ji * V_j
+                    tmpWmJ(m, detshiftI + i) = &
+                         tmpWmJ(m, detshiftI + i) + &
+                         elm*VmI%elms(m, detshiftJ + j)
+                  enddo !m
+
+          end do !p3
+        enddo !i
+        enddo !t1
+      enddo !t2
+      enddo !p1
+    enddo !p2
+    !$OMP END DO
+    !$OMP END PARALLEL
+
+  end subroutine hv_blocs_vvvv_p02_p024
+
+end module vvvv_p02_p02_gen4
diff --git a/src/gener_det.F90 b/src/gener_det.F90
new file mode 100644
index 0000000000000000000000000000000000000000..22ef4add0498f765ecdd3d5768c5a4e9d8f9c5a5
--- /dev/null
+++ b/src/gener_det.F90
@@ -0,0 +1,822 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!----
+
+module gener_det
+
+  use info
+  use files
+  use dimensions
+  use detact
+  use spindetact
+  use typedet
+  !use utils_det
+  use utils_wrt
+
+  implicit none
+
+  type, private :: detarray
+     type(deter), dimension(:), allocatable :: p
+  end type detarray
+
+contains
+  !!============================================================ 
+  !> @brief Generate a determinant block D^m_n
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param name Label of the Dblock (e.g. D^1_-1 -> -11)
+  !> @param rspin Active part of determinants (spin-ordered)
+  !> @param det_info Information on the determinants
+  !> @param o_info Information on the orbitals
+  !> @param sz Spin
+  !> @param det Total determinants by blocks
+  !> @param lkeep
+  !!============================================================ 
+  subroutine gener_totdet(name, rspin, det_info, o_info, sz, det, &
+       prog_info, lkeep)
+
+    integer, intent(in)                                   :: name
+    type(deter_dblocklist), intent(inout)                 :: det
+    type(spinrlist), intent(in)                           :: rspin
+    type(o_infotype), intent(in)                          :: o_info
+    type(det_infotype), intent(inout)                     :: det_info
+    integer, intent(in)                                   :: sz
+    type(prog_infotype), intent(in)                       :: prog_info
+    logical, intent(in)                                   :: lkeep
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ndetM
+    integer :: indx, spinindx
+    type(deter_dblock), pointer :: Dblock
+    integer(kd_int) :: ndetact, ndet
+    type(spindetact_list), pointer :: spinref
+    type(deter), allocatable :: tmpdetlist(:)
+    integer :: ngen
+    integer, parameter :: ndetmax = 2147483647
+    integer :: tmp
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ndetM = det_info%ndetM
+
+    indx = get_deter_block_index(det,name)
+    Dblock => det%detblock(indx)%p
+
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output, '(A,I0)') '  >>> Generation of D', name
+       flush(f_output)
+    endif
+
+    !Get the Active parts 
+    spinindx = get_Rspinindx(dblock%nelCAS)
+    spinref => rspin%l(spinindx)%p
+    ndetact = spinref%ndetCAS
+
+    !Estimate the number of determinants for memory allocation
+    ndet = ndetact
+    
+    if (dblock%nexcVirt .eq. 1) then
+       ndet = ndetact * 2 * (nligv+nvirt)
+    else if (dblock%nexcVirt .eq. 2) then
+       ndet = ndetact * ( nligv + nvirt) * nligv * 4
+    end if
+    if (dblock%nexcOcc .eq. 1) then
+       tmp = 2 * (nligo + nocc)
+       if (tmp .ne. 0) then
+          if (ndet .gt. ndetmax / tmp) then
+             ndet = ndetmax
+          else
+             ndet = ndet * tmp
+          endif
+       else
+          ndet = 0
+       end if
+    else if (dblock%nexcOcc .eq. 2) then
+       tmp = (nligo + nocc) * nligo * 4
+       if (tmp .ne. 0) then
+          if (ndet .gt. ndetmax / tmp) then
+             ndet = ndetmax
+          else
+             ndet = ndet * tmp             
+          endif
+       else
+          ndet = 0
+       endif
+    endif
+
+    if (debug) then
+       write(f_output,'(A,I0)') ' Estimated nb of det. ',ndet
+       flush(f_output)
+    endif
+
+    allocate(tmpdetlist(ndet))
+
+
+    !Allocate array to save shifth when there are 2 holes
+    if (dblock%nexcOcc .eq. 2) then
+       nullify(dblock%shifth_array)
+       allocate(dblock%shifth_array(nligo+nocc))
+       dblock%shifth_array(:) = 0
+    endif
+
+    !Call the particle generators
+    !(which then call the hole and active part generators)
+    !write(*,*) 'Block D',name
+    ngen = 0
+    if (dblock%nexcVirt .eq. 0) then
+       call gener_0p(tmpdetlist, o_info, dblock, spinref, sz, ngen, ndet)
+    else if (dblock%nexcVirt .eq. 1) then
+       call gener_1p(tmpdetlist, o_info, dblock, spinref, sz, ngen, ndet)
+    else if (dblock%nexcVirt .eq. 2) then
+       call gener_2p(tmpdetlist, o_info, dblock, spinref, sz, ngen, ndet)
+    else
+       write(*,*) 'Invalid Number of particles'
+    endif
+
+    ! Determinants are saved only when print_det = .true.
+    if ((ngen.ne.0).and.((prog_info%print_det).or.lkeep)) then
+       allocate(dblock%elms(ngen))
+       dblock%elms(:) = tmpdetlist(1:ngen)  
+    endif
+
+    deallocate(tmpdetlist)
+
+
+    dblock%ndet = ngen
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,'(A25,I3,A3,30X,I10)') &
+            "  Nb of determinants in D",name," = ", ngen
+    endif
+
+
+
+  end subroutine gener_totdet
+
+
+  !$============================================================ 
+  !> @brief Loop over 2 particles
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !! In the 2p case there are 4 spin categories (UU, UD1, UD2 and DD)
+  !! the total determinant shift is then given by the sum of
+  !! - the shift for the spin category (shiftspinp_array(spincat)),
+  !! - the shift for a given p2 either saved in shiftp_array(p2-isftp)
+  !! for UU and DD, or trivially computed for UD1 and UD2 (p2 - isftp - 1)*nligv 
+  !! times the deltashift in between p2 and p2+1 for that spin category
+  !! deltashiftp_array(spincat)
+  
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param o_info Information on the orbitals
+  !> @param dblock Determinant block
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_2p(tmpdetlist, o_info, dBlock, spinref, sz, ngen, nmax)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+    
+     
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isftp, spin
+    integer :: p1, p2
+    type(deter) :: tmpdet
+    integer :: nexcOcc
+
+    integer :: ngen0, npair, ip1p2, ip1p2_calc, p2calc, spincase
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    nexcOcc = dblock%nexcOcc    
+    isftp = 2*(ngel+nocc+nligo+nact)
+
+    !Allocate array to save shiftp
+    allocate(dblock%shiftp_array(nligv+nvirt))
+    dblock%shiftp_array(:) = 0
+
+    
+    !up up (spincase = 1)
+    spincase = 1
+    spin = -2
+    ngen0 = ngen
+    ip1p2 = 1
+    npair = 0
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       tmpdet%detprt(2) = p2
+       p2calc = p2 - isftp
+       if (p2calc .le. nligv) then
+          dblock%shiftp_array(p2calc) = (p2calc - 2)*(p2calc-1)/2 
+       else
+          dblock%shiftp_array(p2calc) = nligv*(nligv - 1)/2 + &
+               (p2calc-nligv-1)*nligv
+       endif
+       
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          tmpdet%detprt(1) = p1
+          !Holes + act
+          npair = ngen
+          if (nexcOcc .eq. 0) then
+             call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 1) then
+             call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 2) then
+             call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          endif
+          npair = ngen - npair
+          
+       enddo
+       
+    enddo
+    if (nligv+nvirt .gt. 0) then
+       dblock%deltashiftp_array(1) = npair
+       dblock%shiftspinp_array(1) = ngen0
+    endif
+
+        
+    !up dn ligvup ligvdn, ligvup virtdn (spincase = 2)
+    spincase = 2
+    spin = 0
+    ngen0 = ngen
+    npair = 0
+    do p2 = isftp + nligv + nvirt + 1, isftp + 2*(nligv + nvirt)
+       tmpdet%detprt(2) = p2
+       do p1 = isftp + 1, isftp + nligv
+          tmpdet%detprt(1) = p1
+          !Holes + act
+          npair = ngen
+          if (nexcOcc .eq. 0) then
+             call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 1) then
+             call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 2) then
+             call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          endif
+          npair = ngen - npair
+       end do
+    end do
+    if (nligv+nvirt .gt. 0) then
+       dblock%deltashiftp_array(2) = npair
+       dblock%shiftspinp_array(2) = ngen0
+    endif
+
+   
+    !up dn virtup ligvdn (spincase = 3)
+    spincase = 3
+    spin = 0
+    ngen0 = ngen
+    npair = 0
+    do p2 = isftp + nligv + nvirt + 1, isftp + 2*nligv + nvirt
+       tmpdet%detprt(2) = p2
+       do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+          tmpdet%detprt(1) = p1
+          !Holes + act
+          npair = ngen
+          if (nexcOcc .eq. 0) then
+             call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 1) then
+             call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 2) then
+             call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          endif
+          npair = ngen - npair
+       end do
+    end do
+    if (nligv .ne. 0) then
+       dblock%deltashiftp_array(3) = npair
+       dblock%shiftspinp_array(3) = ngen0
+    endif
+
+    
+    !dn dn (spincase = 4)
+    spincase = 4
+    spin = +2
+    ngen0 = ngen
+    npair = 0
+    do p2 = isftp + nligv + nvirt + 1, isftp + 2*(nligv + nvirt)
+       tmpdet%detprt(2) = p2
+       do p1 = isftp +nligv + nvirt + 1, min(p2-1, isftp + 2*nligv + nvirt)
+          tmpdet%detprt(1) = p1
+          npair = ngen
+          !Holes + act
+          if (nexcOcc .eq. 0) then
+             call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 1) then
+             call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          else if (nexcOcc .eq. 2) then
+             call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+                  spinref, sz, ngen, nmax, spincase)
+          endif
+          npair = ngen - npair
+       end do
+    end do
+    
+    if (nligv+nvirt .gt. 0) then
+       dblock%deltashiftp_array(4) = npair
+       dblock%shiftspinp_array(4) = ngen0
+    endif
+
+  end subroutine gener_2p
+
+  !$============================================================ 
+  !> @brief Loop over 1 particle
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param o_info Information on the orbitals
+  !> @param nexcOcc Nb of hole excitations
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_1p(tmpdetlist, o_info, dblock, spinref, sz, ngen, nmax)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+      
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isftp, spin, spincase
+    integer :: p1, p2
+    type(deter) :: tmpdet
+    integer :: ngen0
+    integer :: nexcOcc
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    nexcOcc = dblock%nexcOcc    
+    isftp = 2*(ngel+nocc+nligo+nact)
+    tmpdet%detprt(2) = 0
+    
+    !up spincase = 1
+    spincase = 1
+    spin = -1
+    ngen0 = ngen
+    do p1 = isftp + 1, isftp + nligv + nvirt
+       tmpdet%detprt(1) = p1
+       !Holes + act
+       if (nexcOcc .eq. 0) then
+          call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       else if (nexcOcc .eq. 1) then
+          call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       else if (nexcOcc .eq. 2) then
+          call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       endif
+    enddo
+    
+    if (nligv+nvirt .gt. 0) then
+       dblock%deltashiftp_array(1) = (ngen-ngen0)/(nligv + nvirt)
+       dblock%shiftspinp_array(1) = ngen0
+    endif
+    
+    !dn spincase = 2
+    spincase = 2
+    spin = +1
+    ngen0 = ngen
+    do p1 = isftp + nligv + nvirt + 1, isftp + 2*(nligv + nvirt)
+       tmpdet%detprt(1) = p1
+       
+       !Holes + act
+       if (nexcOcc .eq. 0) then
+          call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       else if (nexcOcc .eq. 1) then
+          call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       else if (nexcOcc .eq. 2) then
+          call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+               spinref, sz, ngen, nmax, spincase)
+       endif
+    end do
+    
+    if (nligv+nvirt .gt. 0) then
+       dblock%deltashiftp_array(2) = (ngen-ngen0)/(nligv + nvirt)
+       dblock%shiftspinp_array(2) = ngen0
+    endif
+    
+  end subroutine gener_1p
+
+   !$============================================================ 
+  !> @brief Mo particles
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param o_info Information on the orbitals
+  !> @param nexcOcc Nb of hole excitations
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_0p(tmpdetlist, o_info, dblock, spinref, sz, ngen, nmax)
+    
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+   
+    type(deter) :: tmpdet
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: spin, spincase
+    integer :: p1, p2
+    integer :: nexcOcc
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    nexcOcc = dblock%nexcOcc 
+    tmpdet%detprt(:) = 0
+    spin = 0
+    spincase = 1
+
+    !Holes + act
+    if (nexcOcc .eq. 0) then
+       call gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+            spinref, sz, ngen, nmax, spincase)
+    else if (nexcOcc .eq. 1) then
+       call gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+            spinref, sz, ngen, nmax, spincase)
+    else if (nexcOcc .eq. 2) then
+       call gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin, &
+            spinref, sz, ngen, nmax, spincase)
+    endif
+          
+  end subroutine gener_0p
+
+  !$============================================================ 
+  !> @brief Loop over 2 holes
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param tmpdet Determinant being constructed
+  !> @param o_info Information on the orbitals
+  !> @param spin_p Spin of the particles
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_2h(tmpdetlist, tmpdet, o_info, dblock, spin_p, &
+       spinref, sz, ngen, nmax, spincase)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(deter), intent(inout)              :: tmpdet
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    integer, intent(in)                     :: spin_p    
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+    integer, intent(in)                     :: spincase
+        
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin, i
+    integer :: t1, t2, ngen0, npair, t2calc, ngenp
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    isfth = 2*(ngel)
+
+    
+    !save the particule shift
+    ngenp = ngen
+    
+    !up up
+    spin = spin_p + 2
+    ngen0 = ngen
+    npair = 0
+    do t2 = isfth + 1, isfth+nocc+nligo
+       tmpdet%dettr(2) = t2
+
+       t2calc = t2 - isfth
+       if (t2calc .le. nocc) then
+          dblock%shifth_array(t2calc) = (t2calc-1)*nligo
+       else
+          i = t2calc - nocc - 1
+          dblock%shifth_array(t2calc) = nocc*nligo + &
+               (t2calc-nocc -1)*nligo - i*(i+1)/2 
+       endif
+      
+       do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          tmpdet%dettr(1) = t1
+          npair = ngen
+          !Act
+          call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+          npair = ngen - npair
+       enddo
+
+    enddo
+
+    if (nligo+nocc .gt. 0) then 
+       dblock%deltashifth_array((spincase-1)*4 + 1) = npair
+       dblock%shiftspinh_array((spincase-1)*4 + 1) = ngen0-ngenp
+    endif
+
+    !dn up occup ligodn, ligoup ligodn
+    spin = spin_p
+    ngen0 = ngen
+    do t2 = isfth + 1, isfth+nocc+nligo
+       tmpdet%dettr(2) = t2
+       do t1 = isfth + 2*nocc + nligo + 1, isfth + 2*(nocc+nligo)
+          npair = ngen
+          tmpdet%dettr(1) = t1
+          !Act
+          call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+          npair = ngen - npair
+       enddo
+    enddo
+    if (nligo+nocc .gt. 0) then 
+       dblock%deltashifth_array((spincase-1)*4 +2) = npair
+       dblock%shiftspinh_array((spincase-1)*4 +2) = ngen0-ngenp
+    endif
+    
+
+    !dn up ligoup occdn
+    spin = spin_p
+    ngen0 = ngen
+    do t2 = isfth + nocc + 1, isfth+nocc+nligo
+       tmpdet%dettr(2) = t2
+
+       do t1 = isfth + nocc + nligo + 1, isfth + 2*nocc + nligo
+          npair = ngen
+          tmpdet%dettr(1) = t1
+          !Act
+          call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+          npair = ngen - npair
+       enddo
+    enddo
+    if (nligo .gt. 0) then 
+       dblock%deltashifth_array((spincase-1)*4 + 3) = npair
+       dblock%shiftspinh_array((spincase-1)*4 + 3) = ngen0-ngenp
+    endif
+
+    !dn dn
+    spin = spin_p - 2
+    ngen0 = ngen
+    npair = 0
+    do t2 = isfth + nocc + nligo + 1, isfth + 2*(nocc+nligo)
+       tmpdet%dettr(2) = t2
+       do t1 = max(t2+1, isfth + 2*nocc + nligo +1), isfth+2*(nocc+nligo)
+          tmpdet%dettr(1) = t1
+          npair = ngen
+          !Act
+          call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+          npair = ngen - npair
+       enddo
+    enddo
+     if (nligo+nocc .gt. 0) then
+       dblock%deltashifth_array((spincase-1)*4 +4) = npair
+       dblock%shiftspinh_array((spincase-1)*4 +4) = ngen0-ngenp
+
+    endif
+
+    
+    
+  end subroutine gener_2h
+
+  !$============================================================ 
+  !> @brief Loop over 1 hole
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param tmpdet Determinant being constructed
+  !> @param o_info Information on the orbitals
+  !> @param spin_p Spin of the particles
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_1h(tmpdetlist, tmpdet, o_info, dblock, spin_p, &
+       spinref, sz, ngen, nmax, spincase)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(deter), intent(inout)              :: tmpdet
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    integer, intent(in)                     :: spin_p
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+    integer, intent(in)                     :: spincase
+    
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin, ngen0, ngenp
+    integer :: t1
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    isfth = 2*(ngel)
+    tmpdet%dettr(2) = 0
+
+    !save the particule shift
+    ngenp = ngen
+    
+    !up 
+    spin = spin_p + 1
+    ngen0 = ngen
+    do t1 = isfth + 1, isfth+nocc+nligo
+       tmpdet%dettr(1) = t1
+       !Act
+       call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+    enddo
+
+    if (nligo+nocc .gt. 0)  then
+       dblock%deltashifth_array((spincase-1)*2 +1) = (ngen-ngen0)/(nligo + nocc)
+       dblock%shiftspinh_array((spincase-1)*2 +1) = ngen0-ngenp
+    endif
+
+    !dn
+    ngen0 = ngen
+    spin = spin_p - 1
+    do t1 = isfth + (nocc+nligo) + 1, isfth + 2*(nocc+nligo)
+       tmpdet%dettr(1) = t1
+       !Act
+       call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+    enddo
+
+    if (nligo+nocc .gt. 0) then
+       dblock%deltashifth_array((spincase-1)*2 +2) = (ngen-ngen0)/(nligo + nocc)
+       dblock%shiftspinh_array((spincase-1)*2 +2) = ngen0-ngenp
+    endif
+
+  end subroutine gener_1h
+
+  !$============================================================ 
+  !> @brief No holes
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param tmpdet Determinant being constructed
+  !> @param o_info Information on the orbitals
+  !> @param spin_p Spin of the particles
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_0h(tmpdetlist, tmpdet, o_info, dblock, spin_p, &
+       spinref, sz, ngen, nmax, spincase)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(deter), intent(inout)              :: tmpdet
+    type(o_infotype), intent(in)            :: o_info
+    type(deter_dblock), intent(inout)       :: dblock
+    integer, intent(in)                     :: spin_p
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+    integer, intent(in)                     :: spincase
+        
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin
+    integer :: t1
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    isfth = 2*(ngel)
+    tmpdet%dettr(:) = 0
+
+    spin = spin_p 
+    !Act
+    call gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+    
+  end subroutine gener_0h
+
+  !$============================================================ 
+  !> @brief Loop over the active determinants
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param tmpdetlist List of determinants to be filled
+  !> @param tmpdet Determinant being constructed
+  !> @param o_info Information on the orbitals
+  !> @param nexcOcc Nb of hole excitations
+  !> @param spin Spin of the hole and particules part
+  !> @param spinref Spin detact list
+  !> @param sz Spin
+  !> @param ngen Nb of generated determinants
+  !$============================================================ 
+  subroutine gener_act(tmpdetlist, tmpdet, o_info, spin, spinref, sz, ngen, nmax)
+
+    type(deter), allocatable, intent(inout) :: tmpdetlist(:)
+    type(deter), intent(inout)              :: tmpdet
+    type(o_infotype), intent(in)            :: o_info
+    integer, intent(in)                     :: spin
+    type(spindetact_list), intent(in)       :: spinref
+    integer, intent(in)                     :: sz
+    integer, intent(inout)                  :: ngen, nmax
+    
+    integer :: indx, idetact, isft, ndetact
+    type(deter), allocatable :: tmp(:)
+
+    indx = get_spinCatindx(spinref, spin)
+    
+    if (indx .eq. 0) then
+       call wrtdet(tmpdet, f_output, o_info)
+       write(f_output,*) 'spin', spin
+       call wrt_spindetact_list(spinref, f_output, o_info%nact)
+       call SASS_quit('>>> Wrong spin in gener_act', f_output)
+    endif
+       
+    isft = spinref%ShiftSpinCat(indx)
+    ndetact = spinref%NdetSpinCat(indx)
+    do idetact = isft+1, isft+ndetact
+       tmpdet%detact = spinref%elms(idetact)
+       if (ngen .eq. nmax) then
+          !Increase tmpdetlist by 20 percent
+          nmax = int(nmax * 1.2)
+          allocate(tmp(nmax))
+          tmp(1:ngen) = tmpdetlist(1:ngen)
+          deallocate(tmpdetlist)
+          allocate(tmpdetlist(nmax))
+          tmpdetlist(1:ngen) = tmp(1:ngen)
+          deallocate(tmp)
+       endif
+       ngen = ngen + 1
+       tmpdetlist(ngen) = tmpdet
+    enddo
+    
+  end subroutine gener_act
+
+end module gener_det
diff --git a/src/gener_diagJK.F90 b/src/gener_diagJK.F90
new file mode 100644
index 0000000000000000000000000000000000000000..86869795c5a78d6749ca95694b9f97a7e6a52c46
--- /dev/null
+++ b/src/gener_diagJK.F90
@@ -0,0 +1,1060 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!----
+
+module gener_diagJK
+
+  use info
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  
+  implicit none
+  
+contains 
+
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for the integral kind intkind
+  !> @author ER
+  !> @date May 2018
+  !>
+  !> @param nhole number of holes in J_pq
+  !> @param npart number of particles in J_pq
+  !$====================================================================
+  subroutine hdiag_JK(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, detshift, intkind)
+        
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: detshift
+    character(2), intent(in)                   :: intkind
+
+    type(intblock) :: twoint, twointx
+    logical :: lintx
+    integer :: nsumact
+    integer :: sign
+      
+    
+    if (dblock%nexcVirt .eq. 0) then
+       call JK_0p(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, detshift, &
+            intkind)
+    else if (dblock%nexcVirt .eq. 1) then
+       call JK_1p(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, detshift, &
+            intkind)
+    else if (dblock%nexcVirt .eq. 2) then
+       call JK_2p(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, detshift, &
+            intkind)
+    else
+       write(*,*) 'Invalid Number of particles'
+    endif
+
+    
+  end subroutine hdiag_JK
+
+  
+
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with no particles
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_0p(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, detshift, &
+       intkind)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(in)                        :: detshift
+    character(2), intent(in)                   :: intkind
+    !integer, intent(in)                        :: nhole, npart
+    
+    integer :: shift
+    integer :: spin, spincase
+
+    !write(f_output,*) 'JK 0p ', intkind
+    spincase = 1
+    
+    shift = detshift
+    spin = 0
+    if (dblock%nexcOcc .eq. 0) then
+       !Case D00
+       call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            0, 0, 0, 0, intkind, spincase)
+    else if (dblock%nexcOcc .eq. 1) then
+       !Case D11
+       call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, &
+               spin, shift, 0, 0, 0, 0, intkind, spincase)
+    else if (dblock%nexcOcc .eq. 2) then
+       !Case D20
+       call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, &
+            spin, shift, 0, 0, 0, 0, intkind, spincase)
+    else
+       write(*,*) 'Invalid Number of holes'
+    endif
+
+  end subroutine JK_0p
+
+  
+
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with 1 particle
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_1p(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, shiftdet, &
+       intkind)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(in)                        :: shiftdet
+    character(2), intent(in)                   :: intkind
+    !integer, intent(in)                        :: nhole, npart
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: shift
+    integer :: spin, spincase
+    integer :: isftp
+    integer :: p1
+
+    !write(f_output,*) 'JK 1p ', intkind
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    
+    shift = shiftdet + 0
+    isftp = (ngel+nocc+nligo+nact)
+
+    !up
+    spin = -1
+    spincase = 1
+
+    do p1 = isftp + 1, isftp + nligv + nvirt
+       !write(f_output,'(I0,A,X)',advance="no") p1,'u'
+       !write(f_output,*) shift, &
+       !     dblock%shift + dblock%shiftspinp_array(1) + &
+       !     (p1-isftp-1) * dblock%deltashiftp_array(1)
+       
+       if (dblock%nexcOcc .eq. 0) then
+          !Case D-11
+          call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, &
+               spin, shift, p1, 1, 0, 0, intkind, spincase)
+       else if (dblock%nexcOcc .eq. 1) then
+          !Case D01
+          call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, &
+               spin, shift, p1, 1, 0, 0, intkind, spincase)
+       else if (dblock%nexcOcc .eq. 2) then
+          !Case D12
+          call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, &
+            spin, shift, p1, 1, 0, 0, intkind, spincase)
+       else
+          write(*,*) 'Invalid Number of holes'
+       endif
+    enddo
+
+    !dn
+    spin = +1
+    spincase = 2
+    do p1 = isftp +  1, isftp + nligv + nvirt
+       !write(f_output,'(I0,A,X)',advance="no") p1,'d'
+       !write(f_output,*) shift, &
+       !     dblock%shift + dblock%shiftspinp_array(2) + &
+       !     (p1-isftp-1) * dblock%deltashiftp_array(2)
+       
+       if (dblock%nexcOcc .eq. 0) then
+          !Case D-11
+          call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, &
+               spin, shift, p1, -1, 0, 0, intkind, spincase)
+       else if (dblock%nexcOcc .eq. 1) then
+          !Case D01
+          call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, &
+               spin, shift, p1, -1, 0, 0, intkind, spincase)
+       else if (dblock%nexcOcc .eq. 2) then
+          !Case D12
+          call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, &
+            spin, shift, p1, -1, 0, 0, intkind, spincase)
+       else
+          write(*,*) 'Invalid Number of holes'
+       endif
+    enddo
+    
+  end subroutine JK_1p
+
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with 2 particle
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_2p(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, shiftdet, &
+       intkind)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(in)                        :: shiftdet
+    character(2), intent(in)                   :: intkind
+    !integer, intent(in)                        :: nhole, npart
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: shift
+    integer :: spin, spincase
+    integer :: isftp
+    integer :: p1, p2
+
+    !write(f_output,*) 'JK 2p ', intkind
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    shift = shiftdet + 0
+    isftp = ngel+nocc+nligo+nact
+    !up up
+    spin = -2
+    spincase = 1
+    do p2 = isftp + 1, isftp + nligv + nvirt      
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          !write(f_output,'(I0,A,X)',advance="no") p2,'u'
+          !write(f_output,'(I0,A,X)',advance="no") p1,'u'
+          !write(f_output,*) shift, &
+          !  dblock%shift + dblock%shiftspinp_array(1) &
+          !  + dblock%shiftp_array(p2-isftp)*dblock%deltashiftp_array(1) &
+          !  + (p1-isftp-1)*dblock%deltashiftp_array(1)
+          if (dblock%nexcOcc .eq. 0) then
+             !Case D-20
+             call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, 1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 1) then
+             !Case D-12
+             call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, 1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 2) then
+             !Case D02
+             call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, 1, intkind, spincase)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       enddo
+    enddo
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    spin = 0
+    spincase = 2
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       !New deltashiftp
+       !write(f_output,'(I0,A,X)',advance="no") p2,'UD1'
+       !write(f_output,*) shift, &
+       !     dblock%shift + dblock%shiftspinp_array(2) + &
+       !     (p2-isftp-1)*dblock%deltashiftp_array(2)*nligv
+       !New deltashiftp
+       do p1 = isftp + 1, isftp + nligv
+          !write(f_output,'(2X,I0,A,X)',advance="no") p1,'UD1'
+          !write(f_output,*) shift, &
+          !  dblock%shift + dblock%shiftspinp_array(2) + &
+          !  (p2-isftp-1)*dblock%deltashiftp_array(2)*nligv + &
+          !  (p1-isftp-1)*dblock%deltashiftp_array(2)
+          
+          if (dblock%nexcOcc .eq. 0) then
+             !Case D-20
+             call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 1) then
+             !Case D-12
+             call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 2) then
+             !Case D02
+             call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       end do
+    end do
+
+    !p1up p2dn virtup ligvdn
+    spin = 0
+    spincase = 3
+    do p2 = isftp + 1, isftp + nligv
+       !New deltashiftp
+       !write(f_output,'(I0,A,X)',advance="no") p2,'UD2'
+       !write(f_output,*) shift, &
+       !     dblock%shift + dblock%shiftspinp_array(3) + &
+       !     (p2-isftp-1)*dblock%deltashiftp_array(3)*nvirt
+       do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+          !write(f_output,'(2X,I0,A,X)',advance="no") p1,'UD2'
+          !write(f_output,*) shift, &
+          !  dblock%shift + dblock%shiftspinp_array(3) + &
+          !  (p2-isftp-1)*dblock%deltashiftp_array(3)*nvirt + &
+          !  (p1-isftp-nligv-1)*dblock%deltashiftp_array(3)
+          if (dblock%nexcOcc .eq. 0) then
+             !Case D-20
+             call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 1) then
+             !Case D-12
+             call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 2) then
+             !Case D02
+             call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, 1, p2, -1, intkind, spincase)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       end do
+    end do
+
+    !dn dn
+    spin = +2
+    spincase = 4
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          !write(f_output,'(I0,A,X)',advance="no") p2,'d'
+          !write(f_output,'(I0,A,X)',advance="no") p1,'d'
+          !write(f_output,*) shift, &
+          !  dblock%shift + dblock%shiftspinp_array(4) &
+          !  + dblock%shiftp_array(p2-isftp)*dblock%deltashiftp_array(4) &
+          !  + (p1-isftp-1)*dblock%deltashiftp_array(4)
+          if (dblock%nexcOcc .eq. 0) then
+             !Case D-20
+             call JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, -1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 1) then
+             !Case D-12
+             call JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, -1, p2, -1, intkind, spincase)
+          else if (dblock%nexcOcc .eq. 2) then
+             !Case D02
+             call JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  spin, shift, p1, -1, p2, -1, intkind, spincase)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       enddo
+    enddo
+    
+  end subroutine JK_2p
+  
+
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with no holes
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_0h(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+       p1, spinp1, p2, spinp2, intkind, spincase)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: shift
+    integer, intent(in)                        :: spin
+    integer                                    :: p1, spinp1, p2, spinp2
+    character(2), intent(in)                   :: intkind
+    integer, intent(in)                        :: spincase
+    !integer, intent(in)                        :: nhole, npart
+
+    integer :: shiftsave
+    
+    !write(f_output,*) 'JK 0h ', intkind
+    
+    select case (intkind)
+    case ('aa')
+       call JK_2sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift)
+    case('av')
+       shiftsave = shift
+       call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1)
+       if (p2 .gt. 0) then
+          shift = shiftsave
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p2, spinp2)
+       endif
+    case('vv')
+       !J_p1p2 - K_p1p2
+       call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1, p2, spinp2)
+    case default
+       write(f_output,*) 'intkind: ', intkind
+       call SASS_quit('intkind issue in JK_0h', f_output)
+    end select
+    
+  end subroutine JK_0h
+
+
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with 1 hole
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_1h(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin_p, shift, &
+       p1, spinp1, p2, spinp2, intkind, spincase)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: shift
+    integer, intent(in)                        :: spin_p
+    integer                                    :: p1, spinp1, p2, spinp2
+    character(2), intent(in)                   :: intkind
+    integer, intent(in)                        :: spincase
+    !integer, intent(in)                        :: nhole, npart
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin, shiftt1, shiftp
+    integer :: t1
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    shiftp = shift
+    
+    !write(f_output,*) 'JK 1h ', intkind
+
+    isfth = ngel
+    !up 
+    spin = spin_p + 1
+    do t1 = isfth + 1, isfth+nocc+nligo
+       !write(f_output,'(I0,A,X)',advance="no") t1,'u'
+       !write(f_output,*) shift, &
+       !     shiftp + dblock%shiftspinh_array((spincase-1)*2 + 1) + &
+       !     (t1-isfth-1) * dblock%deltashifth_array((spincase-1)*2 + 1)
+       
+       !Act
+       select case (intkind)
+       case ('aa')
+          !sum_a1a2 J_a1a2 -Ka1a2
+          call JK_2sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift)
+       case ('oa') 
+          ! J_at1 - K_at1
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               t1, 1)
+       case ('av')
+          ! J_ap1 - K_ap1
+          shiftt1 = shift
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1)
+          if (p2.gt.0) then
+             ! J_ap2 - K_ap2
+             shift = shiftt1
+             call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+                  p2, spinp2)
+          endif
+       case ('ov')
+          !J_p1t1 - K_p1t1
+          shiftt1 = shift
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, t1, 1)
+          if (p2.gt.0) then
+             !J_p2t1 - K_p2t1
+             shift = shiftt1
+             call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+                  p2, spinp2, t1, 1)
+          endif
+       case ('vv') 
+          !J_p1p2 - K_p1p2
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2)
+       case default
+          call SASS_quit('Pb in JK_1h intkind',f_output)
+       end select
+    enddo
+
+    !dn  
+    spin = spin_p - 1
+    do t1 = isfth + 1, isfth + nocc+nligo
+       !write(f_output,'(I0,A,X)',advance="no") t1,'d'
+       !write(f_output,*) shift, &
+       !     shiftp + dblock%shiftspinh_array((spincase-1)*2 + 2) + &
+       !     (t1-isfth-1) * dblock%deltashifth_array((spincase-1)*2 + 2)
+       !Act
+       select case (intkind)
+       case ('aa')
+          !sum_a1a2 J_a1a2 -Ka1a2
+          call JK_2sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift)
+       case ('oa') 
+          ! J_at1 - K_at1
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               t1, -1)
+       case ('av')
+          ! J_ap1 - K_ap1
+          shiftt1 = shift
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1)
+          if (p2.gt.0) then
+             ! J_ap2 - K_ap2
+             shift = shiftt1
+             call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+                  p2, spinp2)
+          endif
+       case ('ov')
+          !J_p1t1 - K_p1t1
+          shiftt1 = shift
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, t1, -1)
+          if (p2.gt.0) then
+             !J_p2t1 - K_p2t1
+             shift = shiftt1
+             call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+                  p2, spinp2, t1, -1)
+          endif
+       case ('vv') 
+          !J_p1p2 - K_p1p2
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2)
+       case default
+          call SASS_quit('Pb in JK_1h intkind',f_output)
+       end select
+    enddo
+      
+  end subroutine JK_1h
+
+  
+
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with 2 holes
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_2h(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin_p, shift, &
+       p1, spinp1, p2, spinp2, intkind, spincase)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: shift
+    integer, intent(in)                        :: spin_p
+    integer                                    :: p1, spinp1, p2, spinp2
+    character(2), intent(in)                   :: intkind
+    integer, intent(in)                        :: spincase
+   
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin, shiftsave, shiftp 
+    integer :: t1, t2
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    shiftp = shift
+    
+    !write(f_output,*) 'JK 2h ', intkind
+
+    isfth = ngel
+    !up up
+    spin = spin_p + 2
+    do t2 = isfth + 1, isfth+nocc+nligo
+       do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          !write(f_output,'(2(I0,A,X))',advance="no") t2,'u', t1,'u'
+          !write(f_output,*) shift, &
+          !     shiftp + dblock%shiftspinh_array((spincase-1)*4 + 1) + &
+          !     (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+          !     dblock%deltashifth_array((spincase-1)*4 + 1)
+          call JK_2hspin(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2, t1, 1, t2, 1, intkind)
+       enddo
+    enddo
+
+    !t1dn t2up occup ligodn, ligoup ligodn
+    spin = spin_p
+    do t2 = isfth + 1, isfth+nocc+nligo
+       do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          !write(f_output,'(2(I0,A,X))',advance="no") t2,'u', t1,'d1'
+          !write(f_output,*) shift, &
+          !     shiftp + dblock%shiftspinh_array((spincase-1)*4 + 2) + &
+          !     ((t2-isfth-1)*nligo + t1 - (isfth+nocc+1)) * &
+          !     dblock%deltashifth_array((spincase-1)*4 + 2)
+          call JK_2hspin(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2, t1, -1, t2, 1, intkind)
+       enddo
+    enddo
+
+    !t1dn t2up ligoup occdn
+    spin = spin_p
+    do t2 = isfth + nocc + 1, isfth+nocc+nligo
+       do t1 = isfth + 1, isfth + nocc
+          !write(f_output,'(2(I0,A,X))',advance="no") t2,'u', t1,'d2'
+          !write(f_output,*) shift, &
+          !     shiftp + dblock%shiftspinh_array((spincase-1)*4 + 3) + &
+          !     ((t2-isfth-nocc-1)*nocc + t1 - (isfth+1)) * &
+          !     dblock%deltashifth_array((spincase-1)*4 + 3)
+          call JK_2hspin(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2, t1, -1, t2, 1, intkind)
+       enddo
+    enddo
+
+    !dn dn
+    spin = spin_p - 2
+    do t2 = isfth + 1, isfth + nocc+nligo
+       do t1 = max(t2+1, isfth + nocc +1), isfth + nocc+nligo
+          !write(f_output,'(2(I0,A,X))',advance="no") t2,'d', t1,'d'
+          !write(f_output,*) shift, &
+          !     shiftp + dblock%shiftspinh_array((spincase-1)*4 + 4) + &
+          !     (dblock%shifth_array(t2-isfth) + t1 -  max(t2+1,isfth+nocc+1)) * &
+          !     dblock%deltashifth_array((spincase-1)*4 + 4)
+          call JK_2hspin(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p1, spinp1, p2, spinp2, t1, -1, t2, -1, intkind)
+       enddo
+    enddo
+
+
+  end subroutine JK_2h
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag for dets with 2 holes t1 and t2
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_2hspin(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+       p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, intkind)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: shift
+    integer, intent(in)                        :: spin
+    integer, intent(in)                        :: p1, spinp1, p2, spinp2
+    integer, intent(in)                        :: t1, spint1, t2, spint2
+    character(2), intent(in)                   :: intkind
+
+    integer :: shiftsave
+    
+    select case (intkind)
+    case ('aa')
+       !sum_a1a2 J_a1a2 -Ka1a2
+       call JK_2sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift)
+    case ('oa')
+       ! J_at1 - K_at1
+       shiftsave = shift
+       call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            t1, spint1)
+       ! J_at2 - K_at2
+       shift = shiftsave
+       call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            t2, spint2)
+    case ('av')
+       ! J_ap1 - K_ap1
+       shiftsave = shift
+       call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1)
+       if (p2.gt.0) then
+          ! J_ap2 - K_ap2
+          shift = shiftsave
+          call JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p2, spinp2)
+       endif
+    case ('oo')
+       !J_t1t2 - K_t1t2
+       call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            t1, spint1, t2, spint2)
+    case ('ov')
+       !J_p1t1 - K_p1t1
+       shiftsave = shift
+       call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1, t1, spint1)
+       !J_p1t2 - K_p1t2
+       shift = shiftsave
+       call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1, t2, spint2)
+       if (p2.gt.0) then
+          !J_p2t1 - K_p2t1
+          shift = shiftsave
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p2, spinp2, t1, spint1)
+          !J_p2t2 - K_p2t2
+          shift = shiftsave
+          call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+               twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+               p2, spinp2, t2, spint2)
+       endif
+    case ('vv')
+       !J_p1p2 - K_p1p2
+       call JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+            twoint, twointx, lintx, nsumact, sign, nelact, spin, shift, &
+            p1, spinp1, p2, spinp2)
+    case default
+       call SASS_quit('problem in JK_2h intkind',f_output)
+    end select
+  end subroutine JK_2hspin
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag - sum_a1,a2 J_a1a2 - K_a1a2
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_2sumact(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin, detshift)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: detshift
+    integer, intent(in)                        :: spin
+    
+    integer :: spinindx, idetact, isft, ndetact, i
+    integer, allocatable :: a(:), s(:)
+    integer(kindact) :: detact
+    integer :: nact, no, ng, k, l
+
+    !write(f_output,*) 'JK 2act'
+    
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+    
+    !Get the active determinant block for spin 0
+    spinindx = get_spinCatindx(spinref, spin)
+    if (spinindx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in JK_2sumact', f_output)
+    endif
+       
+    isft = spinref%ShiftSpinCat(spinindx)
+    ndetact = spinref%NdetSpinCat(spinindx)
+    do i=1,ndetact
+       idetact = isft+i
+       detact = spinref%elms(idetact)
+!!$       call wrtact(detact,f_output,.true.,nact)
+!!$       write(f_output,*) detshift + i
+!!$       write(f_output,'(A)') 'sum_a1a2 J_a1a2 - Ka1a2'
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do l=1, nelact+dblock%nelCAS
+          do k=1, l-1
+             hdiag(detshift+i) = hdiag(detshift+i) &
+                  + ijkl(twoint,a(k),a(k),a(l),a(l)) 
+             if (s(k) .eq. s(l)) then
+                hdiag(detshift + i) = hdiag(detshift+ i) &
+                     - ijkl(twoint,a(k),a(l),a(k),a(l))
+             endif
+          enddo
+       enddo
+       !write(666,*) detshift+i, Hdiag(detshift + i) 
+    enddo
+    
+    detshift = detshift + ndetact
+    deallocate(a)
+    deallocate(s)
+    
+  end subroutine JK_2sumact
+
+  
+
+  !$====================================================================
+  !> @brief Add J-K to Hdiag - sum_a J_ax - K_ax where x = t or p
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_1sumact(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin, detshift, x, spinx)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: detshift
+    integer, intent(in)                        :: spin
+    integer, intent(in)                        :: x, spinx
+    
+    integer :: spinindx, idetact, isft, ndetact, i
+    integer, allocatable :: a(:), s(:)
+    integer(kindact) :: detact
+    integer :: nact, no, ng, k
+    real(kd_dble) :: JK
+
+    !write(f_output,*) 'JK 1act', x, spinx
+    
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+    
+    !Get the active determinant block for spin 0
+    spinindx = get_spinCatindx(spinref, spin)
+    if (spinindx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in JK_1sumact', f_output)
+    endif
+
+   
+    
+    isft = spinref%ShiftSpinCat(spinindx)
+    ndetact = spinref%NdetSpinCat(spinindx)
+    do i=1, ndetact
+       JK = 0.d0
+       idetact = isft+i
+       detact = spinref%elms(idetact)
+       !call wrtact(detact,f_output,.false.,nact)
+       !write(f_output,*) 'Hdiag(detshift + i) before',Hdiag(detshift + i)
+       !write(f_output,*) detshift + i
+       !if (sign .eq. -1) write(f_output,'(A)',advance="no") '-'
+       !write(f_output,'(A,I0)', advance ="no") 'sum_a J_a',x
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do k=1, nelact+dblock%nelCAS
+          !write(f_output, *) 'a',a(k),'s',s(k)
+          JK = JK + ijkl(twoint,a(k),a(k),x,x)
+          !write(f_output,*) 'J',a(k),x,ijkl(twoint,a(k),a(k),x,x)
+          if (s(k) .eq. spinx) then
+             if (lintx) then
+                JK = JK - ijkl(twointx,a(k),x,a(k),x)
+                !write(f_output,*) 'K',a(k),x,ijkl(twointx,a(k),x,a(k),x)
+             else
+                JK = JK - ijkl(twoint,a(k),x,a(k),x)
+                !write(f_output,*) 'K',a(k),x,ijkl(twoint,a(k),x,a(k),x)
+             endif
+          endif
+       enddo
+       !if (lintx) write(f_output,'(A,I0)', advance ="no") '- K_a',x
+       !write(f_output,*) 
+       Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+       !write(666,*) detshift+i, Hdiag(detshift + i) 
+       !write(f_output,*) 'Hdiag(detshift + i) after',Hdiag(detshift + i)
+    enddo
+    detshift = detshift + ndetact
+    deallocate(a)
+    deallocate(s)
+    
+  end subroutine JK_1sumact
+
+  
+  !$====================================================================
+  !> @brief Add J-K to Hdiag - J_x1x2 - K_x1x2
+  !> @author ER
+  !> @date May 2018
+  !$====================================================================
+  subroutine JK_0sumact(hdiag, spinref, dblock, o_info, int_info, &
+       twoint, twointx, lintx, nsumact, sign, nelact, spin, detshift, &
+       x1, spinx1, x2, spinx2)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    type(int_infotype), intent(in)             :: int_info
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(intblock), intent(in)                 :: twoint, twointx
+    logical, intent(in)                        :: lintx
+    integer, intent(in)                        :: nsumact
+    integer, intent(in)                        :: sign
+    integer, intent(inout)                     :: detshift
+    integer, intent(in)                        :: spin
+    integer, intent(in)                        :: x1, spinx1, x2, spinx2
+    
+    integer :: spinindx, idetact, isft, ndetact, i
+    integer, allocatable :: a(:), s(:)
+    integer(kindact) :: detact
+    integer :: nact, no, ng, k
+    real(kd_dble) :: JK
+
+        
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+    
+    !Get the active determinant block for spin 0
+    spinindx = get_spinCatindx(spinref, spin)
+    if (spinindx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in JK_0sumact', f_output)
+    endif
+
+    JK = 0.d0
+    isft = spinref%ShiftSpinCat(spinindx)
+    ndetact = spinref%NdetSpinCat(spinindx)
+    do i= 1, ndetact
+       idetact = isft + i
+       detact = spinref%elms(idetact)
+       JK = ijkl(twoint,x1,x1,x2,x2)
+       if (spinx1 .eq. spinx2) then
+          if (lintx) then
+             JK = JK - ijkl(twointx,x1,x2,x1,x2)
+          else
+             JK = JK - ijkl(twoint,x1,x2,x1,x2)
+          endif
+       endif
+       Hdiag(detshift + i) = Hdiag(detshift + i) + sign*JK
+       !write(666,*) detshift+i, Hdiag(detshift + i) 
+      
+    enddo
+    detshift = detshift + ndetact
+    deallocate(a)
+    deallocate(s)
+    
+  end subroutine JK_0sumact
+
+end module gener_diagJK
diff --git a/src/gener_guess.F90 b/src/gener_guess.F90
new file mode 100644
index 0000000000000000000000000000000000000000..68caac8044ef25f8bd29b7a5f0cd91175fda62b6
--- /dev/null
+++ b/src/gener_guess.F90
@@ -0,0 +1,1187 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module gener_guess
+
+  use info
+  use files
+  use detact
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_wrt
+  use gener_diagJK
+  
+  implicit none
+  
+contains
+
+  !$====================================================================
+  !> @brief Build the diagonal Hamiltonian on all determinants
+  !> @author ER
+  !> @date May 2018
+  !
+  !> @param hdiag Diagonal part of the hamiltonian matrix
+  !> @param rspin List of Spindetact lists 
+  !> @param d list of Dblock of determinants
+  !> @param hcoeur Matrix <p|h|q> of the bare Hamiltonian
+  !> @param o_info Orbital info
+  !> @param int_info Integral info
+  !> @param e0 Energy
+  !> @param nelact Nb of active electrons
+  !> @param sz Spin of the ref0 configurations
+  !$==================================================================== 
+  subroutine build_hdiag(hdiag, rspin, det, hcoeur, fock, o_info, int_info, &
+       e0, nelact, sz, prog_info)
+
+    real(kd_dble), dimension(:), allocatable, intent(inout) :: hdiag
+    type(spinrlist), intent(in)                :: rspin
+    type(deter_dblocklist), intent(in)         :: det
+    real(kd_dble), dimension(:,:), allocatable, intent(in) :: hcoeur, fock
+    type(o_infotype), intent(in)               :: o_info
+    type(int_infotype), intent(in)             :: int_info
+    real(kd_dble)                              :: e0
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: sz
+    type(prog_infotype), intent(in)            :: prog_info
+
+    integer :: name 
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: indx, spinindx, i
+    type(deter_dblock), pointer :: Dblock
+    integer :: ndetact, ndet
+    type(spindetact_list), pointer :: spinref
+    type(deter), allocatable :: tmpdetlist(:)
+    integer :: ngen, nd00, shiftdet
+    character(2), dimension(6) :: intkindlist
+    character(2) :: intkind
+    integer :: ndblock
+    integer, allocatable :: dnamelist(:)
+    type(intblock) :: twoint, twointx
+    logical :: lintx
+    integer :: nsumact
+    integer :: sign
+
+    integer :: nhole, npart
+
+    real(kd_dble) ::  t1, t2
+
+    !Initialisation
+    hdiag(:) = 0.d0
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    nd00 = det%detblock(1)%p%ndet
+
+    !Fock
+    !Get the determinant block
+    shiftdet = 0
+    do indx = 1, det%nblock
+       Dblock => det%detblock(indx)%p
+       ndet = Dblock%ndet
+
+       call cpu_time(t1)
+       if (ndet.ne.0) then
+          !Get the Active parts 
+          spinindx = get_Rspinindx(dblock%nelCAS)
+          spinref => rspin%l(spinindx)%p
+          ndetact = spinref%ndetCAS
+
+          call hdiag_fock(hdiag, spinref, dblock, fock, o_info, nelact, &
+               dblock%shift)
+       endif
+       call cpu_time(t2)
+       !if (prog_info%id_cpu.eq.0) then
+       !   write(f_output,*) ' >>> Fock added to block D',Dblock%namec,&
+       !        ' in hdiag in',t2-t1,'second(s)'
+       !   flush(f_output)
+       !endif
+
+    enddo
+
+    !Integral parts
+    intkindlist = (/ 'aa', 'oo', 'vv', 'ov', 'oa', 'av' /)
+
+    do i = 1, 6
+       intkind = intkindlist(i)
+
+       select case (intkind)
+       case ('aa')
+          nhole = 0
+          npart = 0
+          call get_twoint(twoint,'aaaa',o_info, int_info, prog_info%id_cpu)
+          lintx = .false.
+          nsumact = 2
+          sign = 1
+          ndblock = 9
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 00,01,02,11,12,-11,-12,20,-20 /)
+          !write(*,*) 'aa'
+       case ('oo')
+          nhole = 2
+          npart = 0
+          call get_twoint(twoint,'oooo',o_info, int_info, prog_info%id_cpu)
+          lintx = .false.
+          nsumact = 0
+          sign = 1
+          ndblock = 3
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 02,12,20 /)
+          !write(*,*) 'oo'
+       case ('vv')
+          nhole = 0
+          npart = 2
+          call get_twoint(twoint,'vvvv',o_info, int_info, prog_info%id_cpu)
+          lintx = .false.
+          nsumact = 0
+          sign = 1
+          ndblock = 3
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 02,-12,-20 /)
+          !write(*,*) 'vv'
+       case ('ov')
+          nhole = 1
+          npart = 1
+          call get_twoint(twoint,'vvoo',o_info, int_info, prog_info%id_cpu)
+          call get_twoint(twointx,'vovo',o_info, int_info, prog_info%id_cpu)
+          lintx = .true.
+          nsumact = 0
+          sign = -1
+          ndblock = 4
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,12,-12 /)
+          !write(*,*) 'ov'
+       case ('oa')
+          nhole = 1
+          npart = 0
+          call get_twoint(twoint,'aaoo',o_info, int_info, prog_info%id_cpu)
+          call get_twoint(twointx,'aoao',o_info, int_info, prog_info%id_cpu)
+          lintx = .true.
+          nsumact = 1
+          sign = -1
+          ndblock = 6
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,11,12,-12,20 /)
+          !write(*,*) 'oa'
+       case ('av')
+          nhole = 0
+          npart = 1
+          call get_twoint(twoint,'vvaa',o_info, int_info, prog_info%id_cpu)
+          call get_twoint(twointx,'vava',o_info, int_info, prog_info%id_cpu)
+          lintx = .true.
+          nsumact = 1
+          sign = 1
+          ndblock = 6
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,12,-11,-12,-20 /)
+          !write(*,*) 'av'
+       end select
+
+       !J - K
+       !Get the determinant block
+       do name = 1, ndblock
+          indx = get_deter_block_index(det,dnamelist(name))
+          Dblock => det%detblock(indx)%p
+          ndet = Dblock%ndet
+
+          if (ndet .ne. 0) then
+             shiftdet = Dblock%shift
+
+             !Get the Active parts 
+             spinindx = get_Rspinindx(dblock%nelCAS)
+             spinref => rspin%l(spinindx)%p
+             ndetact = spinref%ndetCAS
+
+             !write(f_output,*)
+             !write(f_output,'(A8,A2,A3,I3)') 'Add J-K ', intkind, ' D ', Dblock%name
+             !flush(f_output)
+             call hdiag_JK(hdiag, spinref, dblock, o_info, int_info, &
+                  twoint, twointx, lintx, nsumact, sign, nelact, &
+                  shiftdet, intkind)
+          endif
+
+       enddo!Loop over the determinant blocks
+
+       call intblock_free(twoint)
+       if (lintx) then
+          call intblock_free(twointx)
+       endif
+       deallocate(dnamelist)
+    enddo !Loop over integral blocks
+
+  end subroutine build_hdiag
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag
+  !!============================================================ 
+  subroutine hdiag_fock(hdiag, spinref, dblock, fock, o_info, nelact, &
+       shiftdet)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: shiftdet
+
+    if (dblock%nexcVirt .eq. 0) then
+       call fock_0p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    else if (dblock%nexcVirt .eq. 1) then
+       call fock_1p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    else if (dblock%nexcVirt .eq. 2) then
+       call fock_2p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    else
+       write(*,*) 'Invalid Number of particles'
+    endif
+
+  end subroutine hdiag_fock
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with no particles
+  !!============================================================ 
+  subroutine fock_0p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: shiftdet
+
+    integer :: shift
+    integer :: spin
+    
+    shift = shiftdet + 0
+    spin = 0
+    !write(*,*) '0p'
+    if (dblock%nexcOcc .eq. 0) then
+       call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, 0.d0)
+    else if (dblock%nexcOcc .eq. 1) then
+       call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, 0.d0)
+    else if (dblock%nexcOcc .eq. 2) then
+       call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, 0.d0)
+    else
+       write(*,*) 'Invalid Number of holes'
+    endif
+    
+  end subroutine fock_0p
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with 1 particle
+  !!============================================================ 
+  subroutine fock_1p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: shiftdet
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: shift
+    integer :: spin
+    integer :: isftp
+    integer :: p1
+    real(kd_dble) :: Fp1p1
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    
+    !shift = shiftdet + 0
+    isftp = (ngel+nocc+nligo+nact)
+
+    if (nligv + nvirt .ne. 0) then
+       !up
+       spin = -1
+       !$OMP PARALLEL PRIVATE(p1,shift,Fp1p1)
+       !$OMP DO
+       do p1 = isftp + 1, isftp + nligv + nvirt
+          shift = shiftdet + dblock%shiftspinp_array(1) + &
+               (p1-isftp-1)*dblock%deltashiftp_array(1)
+          Fp1p1 = fock(p1,p1)
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       enddo
+       !$OMP END DO
+
+       !dn
+       spin = +1
+       !$OMP DO
+       do p1 = isftp +  1, isftp + nligv + nvirt
+          shift = shiftdet + dblock%shiftspinp_array(2) + &
+               (p1-isftp-1)*dblock%deltashiftp_array(2)
+          Fp1p1 = fock(p1,p1) 
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp1p1)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       enddo
+       !$OMP END DO
+       !$OMP END PARALLEL
+    endif
+  end subroutine fock_1p
+
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with 2 particles
+  !!============================================================ 
+  subroutine fock_2p(hdiag, spinref, dblock, fock, o_info, nelact, shiftdet)
+    
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: shiftdet
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: shift
+    integer :: spin
+    integer :: isftp
+    integer :: p1, p2
+    real(kd_dble) :: Fp
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    shift = shiftdet
+    isftp = ngel+nocc+nligo+nact
+
+    !up up
+    spin = -2
+    !$OMP PARALLEL PRIVATE(p2, shift, p1, Fp)
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       shift = shiftdet + dblock%shiftspinp_array(1) + &
+            dblock%shiftp_array(p2-isftp)*dblock%deltashiftp_array(1)
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          Fp = fock(p1,p1) + fock(p2,p2)
+          !Holes + act
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       enddo
+    enddo
+    !$OMP END DO
+
+    !up dn ligvup ligvdn, ligvup virtdn
+    spin = 0
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       shift = shiftdet + dblock%shiftspinp_array(2) + &
+            (p2-isftp-1)*dblock%deltashiftp_array(2)*nligv
+       do p1 = isftp + 1, isftp + nligv
+          Fp = fock(p1,p1) + fock(p2,p2)
+          !Holes + act
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       end do
+    end do
+    !$EMP END DO
+
+    !up dn virtup ligvdn
+    spin = 0
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv
+       shift = shiftdet + dblock%shiftspinp_array(3) + &
+            (p2-isftp-1)*dblock%deltashiftp_array(3)*nvirt
+       do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+          Fp = fock(p1,p1) + fock(p2,p2)
+          !Holes + act
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       end do
+    end do
+    !$OMP END DO
+
+    !dn dn
+    spin = +2
+    !$OMP DO
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       shift = shiftdet + dblock%shiftspinp_array(4) + &
+            dblock%shiftp_array(p2-isftp)*dblock%deltashiftp_array(4)
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          Fp = fock(p1,p1) + fock(p2,p2)
+          !Holes + act
+          if (dblock%nexcOcc .eq. 0) then
+             call fock_0h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 1) then
+             call fock_1h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else if (dblock%nexcOcc .eq. 2) then
+             call fock_2h(hdiag, spinref, dblock, fock, o_info, spin, &
+                  nelact, shift, Fp)
+          else
+             write(*,*) 'Invalid Number of holes'
+          endif
+       end do
+    end do
+    !$OMP END DO
+    !$OMP END PARALLEL
+    
+  end subroutine fock_2p
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with no holes
+  !!============================================================ 
+  subroutine fock_0h(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Fp)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(inout)                     :: shift
+    integer, intent(inout)                     :: spin
+    real(kd_dble), intent(in)                  :: Fp
+
+    !write(*,*) '0h'
+    call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Fp)
+
+  end subroutine fock_0h
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with 1 hole
+  !!============================================================ 
+    subroutine fock_1h(hdiag, spinref, dblock, fock, o_info, spin_p, nelact, shift, Fp)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(inout)                     :: shift
+    integer, intent(inout)                     :: spin_p
+    real(kd_dble), intent(in)                  :: Fp
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin
+    integer :: t1
+    real(kd_dble) :: Ftp
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    isfth = ngel
+    !up 
+    spin = spin_p + 1
+    do t1 = isfth + 1, isfth+nocc+nligo
+       Ftp = Fp - fock(t1,t1) 
+       !Act
+       call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+    enddo
+
+    !dn  
+    spin = spin_p - 1
+    do t1 = isfth + 1, isfth + nocc+nligo
+       Ftp = Fp - fock(t1,t1) 
+       !Act
+       call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+    enddo
+    
+  end subroutine fock_1h
+
+
+  !!============================================================ 
+  !> @brief Add the Fock part to Hdiag for det with 2 holes
+  !!============================================================ 
+  subroutine fock_2h(hdiag, spinref, dblock, fock, o_info, spin_p, nelact, shift, Fp)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    integer, intent(inout)                     :: shift
+    integer, intent(inout)                     :: spin_p
+    real(kd_dble), intent(in)                  :: Fp
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt
+    integer :: isfth, spin
+    integer :: t1, t2
+    real(kd_dble) :: Ftp
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    !write(*,*) '2h'
+    isfth = ngel
+    !isfth = 2*(ngel)
+    !up up
+    spin = spin_p + 2
+    do t2 = isfth + 1, isfth+nocc+nligo
+       do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          Ftp = Fp - fock(t1,t1) - fock(t2,t2) !Orbital or spin-orbital ???
+          !Act
+          call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+       enddo
+    enddo
+
+    !dn up occup ligodn, ligoup ligodn
+    spin = spin_p
+    do t2 = isfth + 1, isfth+nocc+nligo
+       do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          Ftp = Fp - fock(t1,t1) - fock(t2,t2) !Orbital or spin-orbital ???
+          !Act
+          call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+       enddo
+    enddo
+
+    !dn up ligoup occdn
+    spin = spin_p
+    do t2 = isfth + nocc + 1, isfth+nocc+nligo
+       do t1 = isfth + 1, isfth + nocc 
+          Ftp = Fp - fock(t1,t1) - fock(t2,t2) !Orbital or spin-orbital ???
+          !Act
+          call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+       enddo
+    enddo
+
+    !dn dn
+    spin = spin_p - 2
+    do t2 = isfth + 1, isfth + nocc+nligo
+       do t1 = max(t2+1, isfth + nocc +1), isfth + nocc+nligo
+          Ftp = Fp - fock(t1,t1) - fock(t2,t2) !Orbital or spin-orbital ???
+          !Act
+          call fock_act(hdiag, spinref, dblock, fock, o_info, spin, nelact, shift, Ftp)
+       enddo
+    enddo
+
+  end subroutine fock_2h
+
+
+  !!============================================================ 
+  !> @brief Add the active Fock part to Hdiag
+  !!============================================================
+  subroutine fock_act(hdiag, spinref, dblock, fock, o_info, spin, &
+       nelact, detshift, Ftp)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), pointer             :: spinref
+    type(deter_dblock), pointer                :: Dblock
+    real(kd_dble), dimension(:,:), allocatable :: fock
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: spin
+    integer, intent(in)                        :: nelact
+    integer, intent(inout)                     :: detshift
+    real(kd_dble), intent(in)                  :: Ftp
+
+    integer :: indx, idetact, isft, ndetact, i
+    real(kd_dble) :: Faa
+    integer, allocatable :: a(:), s(:)
+    integer(kindact) :: detact
+    integer :: nact, no, ng, k
+
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    allocate(a(nelact+dblock%nelCAS))
+    allocate(s(nelact+dblock%nelCAS))
+    
+    !Add F_aa for all detact with the correct spin
+    indx = get_spinCatindx(spinref, spin)
+    if (indx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in fock_act', f_output)
+    endif
+
+    isft = spinref%ShiftSpinCat(indx)
+    ndetact = spinref%NdetSpinCat(indx)
+    do i = 1, ndetact
+       idetact = isft+i
+       detact = spinref%elms(idetact)
+       Faa = Ftp
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do k=1,nelact+dblock%nelCAS
+          Faa = Faa + fock(a(k),a(k))
+       enddo
+       hdiag(detshift + i) = hdiag(detshift + i) + Faa
+    enddo
+    detshift = detshift + ndetact
+
+    deallocate(a)
+    deallocate(s)
+  end subroutine fock_act
+
+
+
+ 
+  
+  !$====================================================================
+  !> @brief Build the diagonal Hamiltonian in the d00-d00 block
+  !> @author ER
+  !> @date May 2018
+  !
+  !> @param hdiag Diagonal part of the hamiltonian matrix
+  !> @param r0 Spin detact list for NelCAS=0
+  !> @param d list of Dblock of determinants
+  !> @param hcoeur MAtrix <p|h|q> of the bare Hamiltonian
+  !> @param o_info Orbital info
+  !> @param int_info Integral info
+  !> @param e0 Energy
+  !> @param nelact Nb of active electrons
+  !> @param sz Spin of the ref0 configurations
+  !$==================================================================== 
+  subroutine build_hdiag00(hdiag, r0, d, hcoeur, o_info, int_info, e0, nelact, sz, prog_info)
+
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(spindetact_list), intent(in)          :: r0
+    type(deter_dblocklist), intent(in)         :: d
+    real(kd_dble), dimension(:,:), allocatable :: hcoeur
+    type(o_infotype), intent(in)               :: o_info
+    type(int_infotype), intent(in)             :: int_info
+    real(kd_dble)                              :: e0
+    integer, intent(in)                        :: nelact
+    integer, intent(in)                        :: sz
+    type(prog_infotype), intent(in)            :: prog_info
+
+    integer :: idetact, nact, no, k, l, ng, p, indx, nd00
+    integer :: spinindx, isft, ndetact
+    integer, allocatable :: a(:), s(:)
+    integer(kindact) :: detact
+    type(intblock) :: twoint, twointx
+    type(deter_dblock), pointer :: d00
+
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo
+    ng = o_info%ngel
+    allocate(a(nelact))
+    allocate(s(nelact))
+
+    !Get the determinant block
+    indx = get_deter_block_index(d,0)
+    d00 => d%detblock(indx)%p
+    nd00 = d00%ndet
+
+    !Get the active determinant block for spin 0
+    spinindx = get_spinCatindx(r0, 0)
+    if (spinindx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in gener_act', f_output)
+    endif
+       
+    isft = r0%ShiftSpinCat(spinindx)
+    ndetact = r0%NdetSpinCat(spinindx)
+    if (ndetact .ne. nd00) &
+         call SASS_quit('>>> wrong number of determinants in hdiag00', f_output)   
+    
+    !Hcoeur
+    do idetact = isft+1, isft+ndetact
+       detact = r0%elms(idetact)
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do k=1,nelact
+          hdiag(idetact) = hdiag(idetact) + hcoeur(a(k),a(k))
+       enddo
+    enddo
+
+    !J_{oa} - K_{oa}
+    !AA (aa|oo) (ao|ao)
+    call get_twoint(twoint,'aaoo',o_info, int_info, prog_info%id_cpu)
+    call get_twoint(twointx,'aoao',o_info, int_info, prog_info%id_cpu)
+    do idetact =  isft+1, isft+ndetact
+       detact = r0%elms(idetact)
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do p = ng+1,ng+no
+          do k=1,nelact
+             hdiag(idetact) = hdiag(idetact) + 2*ijkl(twoint,a(k),a(k),p,p) &
+                  - ijkl(twointx,a(k),p,a(k),p)
+          enddo
+       enddo
+    enddo
+    call intblock_free(twoint)
+    call intblock_free(twointx)
+
+    write(f_output, *) 'Faa hdiag00'
+    write(f_output,*) hdiag(1:nd00)
+    
+    !J_{aa} - K_{aa}
+    call get_twoint(twoint,'aaaa',o_info, int_info, prog_info%id_cpu)
+    do idetact = isft+1, isft+ndetact
+       detact = r0%elms(idetact)
+       call extract_orbindx_from_detact(detact, a, s, no+ng, nact)
+       do l=1, nelact
+          do k=1, l-1
+             hdiag(idetact) = hdiag(idetact) + ijkl(twoint,a(k),a(k),a(l),a(l)) 
+             if (s(k) .eq. s(l)) then
+                hdiag(idetact) = hdiag(idetact) - ijkl(twoint,a(k),a(l),a(k),a(l))
+             endif
+          enddo
+       enddo
+    enddo
+    call intblock_free(twoint)
+    deallocate(a)
+    deallocate(s)
+
+    write(f_output, *) 'Faa + J-K hdiag00'
+    write(f_output,*) hdiag(1:nd00)
+    
+  end subroutine build_hdiag00
+
+  
+  !$====================================================================
+  !> @brief Build the <D00|H|D00> block of the Hamiltonian matrix
+  !> @author ER
+  !> @date May 2018
+  !
+  !> @param h0 <D00|H|D00> block of the Hamiltonian matrix
+  !> @param r0 Spin detact list for NelCAS=0
+  !> @param d list of Dblock of determinants
+  !> @param hdiag Diagonal part of the Hamiltonian
+  !> @param g_info General info 
+  !> @param o_info Orbital info
+  !> @param ord_info Ordering of the orbitals
+  !> @param int_info Integral info
+  !> @param sz Spin of the ref0 configurations
+  !$==================================================================== 
+  subroutine compute_h0(h0, r0, d, fock, hdiag, g_info, o_info, ord_info, &
+       int_info, sz, prog_info)
+
+    type(spindetact_list), intent(in)          :: r0
+    real(kd_dble), dimension(:,:), allocatable :: fock, h0
+    type(deter_dblocklist)                     :: d
+    real(kd_dble), dimension(:), allocatable   :: hdiag
+    type(g_infotype), intent(in)               :: g_info
+    type(o_infotype), intent(in)               :: o_info
+    type(ord_infotype), intent(in)             :: ord_info
+    type(int_infotype), intent(in)             :: int_info
+    integer, intent(in)                        :: sz
+    type(prog_infotype), intent(in)            :: prog_info
+    
+    integer :: i, j, k
+    integer :: idetact, jdetact, jpos
+    type(intblock) :: twoint
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    integer(kindact) :: diffi, diffj, and_ij
+    integer :: sign
+    integer, dimension(2) :: ai, aj, si, sj
+    integer, allocatable :: a(:), s(:)
+    real(kd_dble) :: mat_elm
+    integer :: no, nact, nelact
+    type(deter_dblock), pointer :: d00
+    integer :: nd00, indx, spinindx, isft, ndetact
+    integer :: ni, nj, nk
+    
+    nelact = g_info%nelact
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    !Get the determinant block
+    indx = get_deter_block_index(d,0)
+    d00 => d%detblock(indx)%p
+    nd00 = d00%ndet
+
+    !Get the active determinant block for spin 0
+    spinindx = get_spinCatindx(r0, 0)
+    if (spinindx .eq. 0) then
+       call SASS_quit('>>> Wrong spin in gener_act', f_output)
+    endif
+       
+    isft = r0%ShiftSpinCat(spinindx)
+    ndetact = r0%NdetSpinCat(spinindx)
+    if (ndetact .ne. nd00) &
+         call SASS_quit('>>> wrong number of determinants in hdiag00', f_output)
+    
+    call get_twoint(twoint,'aaaa',o_info, int_info, prog_info%id_cpu)
+
+    allocate(h0(nd00,nd00))
+    h0(:,:) = 0.d0
+
+    !Two differences in the CAS
+    do idetact = isft+1, isft+ndetact
+       !Get the active determinants connecting at second order
+       call CM2_spindetact_list(r0, r0, idetact, nact, nCM2, detCM2, detCM2orb)
+       do jpos = 1,nCM2
+          jdetact = detCM2(jpos)
+          if ((jdetact .ge. isft+1) .and. (jdetact .le. isft+ndetact)) then
+             
+             call extract_detCMorb(detCM2orb(jpos)%p, ai, aj, si, sj, sign, ni, nj, nk)
+             
+             mat_elm = sign * ijkl(twoint,ai(1),aj(1),ai(2),aj(2))
+             if (si(1) .eq. si(2)) &
+                  mat_elm = mat_elm - sign*ijkl(twoint,ai(1),ai(2),aj(1),aj(2))
+             h0(idetact, jdetact) = mat_elm
+             h0(jdetact, idetact) = mat_elm
+          endif
+       enddo
+    enddo
+
+    !One difference in the CAS
+    allocate(a(nelact-1))
+    allocate(s(nelact-1))
+    do idetact = isft+1, isft+ndetact
+       call CM1_spindetact_list(r0, r0, idetact, nact, nCM1, detCM1, detCM1orb)
+       
+       do jpos = 1,nCM1
+          jdetact = detCM1(jpos)
+          if ((jdetact .ge. isft+1) .and. (jdetact .le. isft+ndetact)) then
+             call extract_detCMorb(detCM1orb(jpos)%p, ai, aj, si, sj, sign, ni, nj, nk, a, s)
+             
+             mat_elm = sign*fock(ai(1), aj(1))
+             
+             do k=1, nelact-1
+             
+                mat_elm = mat_elm + sign * ijkl(twoint,ai(1),aj(1),a(k),a(k))
+                if (si(1) .eq. s(k)) then
+                   mat_elm = mat_elm - sign*ijkl(twoint,ai(1),a(k),aj(1),a(k))
+                endif
+             enddo
+             
+             h0(idetact, jdetact) = mat_elm
+             h0(jdetact, idetact) = mat_elm
+          endif
+       enddo
+    enddo
+    deallocate(a)
+    deallocate(s)
+        
+    !No difference in the CAS
+    do idetact = isft+1, isft+ndetact
+       h0(idetact, idetact) = Hdiag(idetact)
+    enddo
+             
+    call intblock_free(twoint)
+    
+  end subroutine compute_h0
+
+  
+  !$====================================================================
+  !> @brief Generates the guess from the D00-D00 block
+  !> @author ER
+  !> @date April 2018
+  !
+  !> @param h0 <D00|H|D00> block of the Hamiltonian matrix
+  !> @param n Nb of determinants in the block d00
+  !> @param ener_info Energy information
+  !> @param nvec Number of target states
+  !$==================================================================== 
+  subroutine diag_h0(h0, phi_0_guess, nd00, ener_info, nvec, prog_info)
+    
+    real(kd_dble), dimension(:,:), allocatable, intent(in)    :: h0
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: phi_0_guess
+    type(ener_infotype), intent(in)                        :: ener_info 
+    integer, intent(in)                                    :: nd00, nvec
+    type(prog_infotype), intent(in)                        :: prog_info
+
+    logical :: debug = .false.
+    integer :: info, i
+    real(kd_dble), allocatable, dimension(:,:) :: vec
+    real(kd_dble), allocatable, dimension(:)   :: e
+    real(kd_dble) :: e0
+
+    e0 = ener_info%Ecoeur + ener_info%potnuc
+
+    if (debug) then
+       write(f_output,*)
+       write(f_output,*) '<D00|H|D00> block of the Hamiltonian matrix'
+       call wrtmat_accurate(h0, nd00, nd00, nd00, f_output)
+    endif
+
+    allocate(phi_0_guess(nd00, nvec))
+    allocate(vec(nd00,nd00))
+    allocate(e(nd00))
+
+    call diag(h0, e, vec, nd00, prog_info%idiag, f_output, info)
+   
+    if (debug) then
+       write(f_output,*)
+       write(f_output,*) 'Eigenvalues of the D00-D00 Matrix'
+       do i = 1,nd00 
+          write(f_output,'(2X,I0,X,F22.16)') i, e0 + e(i)
+       enddo
+
+       
+       flush(f_output)
+    endif
+
+    phi_0_guess = vec(:, 1:nvec)
+
+    
+    deallocate(vec)
+    deallocate(e)
+    
+  end subroutine diag_h0
+
+  !$====================================================================
+  !> @brief Read the guess from the file f_restart
+  !> @author MBL
+  !> @date Feb.  2019
+  !
+  !> @param[allocated] psi_0_guess : guess vectors
+  !> @param[in] n : Nb of determinants
+  !> @param[in] nvec : Number of target states in the code
+  !> @param[out] nvectot : Number of target states read from the restart file
+  !!     If nvec > nvectot read from restart file
+  !!        nvec - nvectot new guess vectors  generated
+  !> @param[in] pot : Nuclear potential read from molcas file
+  !!     to be compared with the value read from the restart file
+  !> @param[in] Ec : Core energy read from molcas file
+  !!     to be compared with the value read from the restart file
+  !$==================================================================== 
+subroutine  lect_guess(psi_0_guess, n, nvec, nvectot, iter, pot, Ec)
+  Real*8, parameter :: seuil = 1.d-12 
+  real(kd_dble), allocatable :: psi_0_guess(:,:)
+  Real (KIND=kd_dble), intent(in) :: Ec
+  Real*8, intent(in) :: pot
+  integer, intent(in) :: n, nvec
+  Integer, intent(inout) :: iter
+  Real*8 ::  Ecoeur,PotNuc
+  Real(kd_dble), dimension(nvec) :: ener
+  Integer ::  nvectot,ndet,nconv, ivec, idet, nveclus
+
+  write(f_output,*)
+  write(f_output,*) " Guess vectors read from file"
+
+  rewind (f_restart)
+  read(f_restart) nvectot,ndet,nconv, iter
+  nveclus = nvectot
+  
+  if (nvec.ne.nvectot) then
+     write(f_output,*)
+     write(f_output,'(" Number of guess vectors read from file: ",i4, &
+          " different from number of required ones :",i4)') nvectot, nvec
+     if (nvec.lt.nvectot) then
+        write(f_output,'(i4," last restart vectors will be discarted")') nvectot-nvec
+        nveclus = nvec
+     else if (nvec.gt.nvectot) then
+        write(f_output,'(i4," extra guess vectors will be generated from H0=<D00|H|D00>")') &
+             nvec-nvectot
+        ! nveclus = nvectot
+     end if
+     write(f_output,*)
+!     call generautres()
+     call SASS_quit('Error in guess vectors read from file', f_output)
+  end if
+  if (n.ne.ndet) then
+     write(f_output,*)
+     write(f_output,'(" Number of determinants read from file: ",i4, &
+          " different from number of computed ones :",i4)') ndet, n
+     write(f_output,*)
+     call SASS_quit('Error in nb of determinants read from file', f_output)
+  end if
+  
+  allocate(psi_0_guess(n,nvec))
+  psi_0_guess(:,:) = 0.d0
+  
+  read(f_restart) Ecoeur,PotNuc
+  if (pot.ne.potnuc) then
+     write(f_output,*)
+     write(f_output,'(" Nuclear potential read from restart file: ",i4, &
+          " differs from read on molcas file :",i4)') potnuc, pot
+     write(f_output,*)
+     if (abs(potnuc-pot).ge.seuil) call SASS_quit('Error in potnuc read from file', f_output)
+  end if
+  if (Ec.ne.Ecoeur) then
+     write(f_output,*)
+     write(f_output,'(" Core energy read from restart file: ",i4, &
+          " differs from read on molcas file :",i4)') Ecoeur, Ec
+     write(f_output,*)
+     if (abs(Ecoeur-Ec).ge.seuil) call SASS_quit('Error in Ecoeur read from file', f_output)
+  end if
+
+  read(f_restart) (ener(ivec), ivec =1,nveclus)
+  do ivec = 1,nveclus
+     read(f_restart) (psi_0_guess(idet,ivec),idet=1,ndet)
+  end do
+  
+end subroutine lect_guess
+
+
+  !$====================================================================
+  !> @brief Generate missing guess vectors not read from the file f_restart
+  !> @author MBL
+  !> @date May  2019
+  !
+  !> @param[inout] psi_0_guess : guess vectors
+  !> @param[in] n : Nb of determinants
+  !> @param[in] nvec : Number of target states in the code
+  !> @param[in] nvectot : Number of target states read from the restart file
+  !!        nvec - nvectot new guess vectors  generated
+  !$==================================================================== 
+subroutine complement_guess(psi_0_guess, ndet, nvec, nvectot, r0,d, fock, hdiag, &
+     g_info, o_info, ord_info, int_info, sz, ener_info, prog_info)
+!!$ -------- Donness globales ---------------------------------
+  use info
+!!$ -------- Donnes locales -----------------------------------
+  Implicit none 
+  real(kd_dble), dimension(ndet,nvec), intent(inout) :: psi_0_guess(:,:)
+  Integer, intent(in)                        :: ndet, nvec, nvectot
+  type(spindetact_list), intent(in)          :: r0
+  type(deter_dblocklist), intent(in)         :: d
+  type(g_infotype), intent(in)               :: g_info
+  type(o_infotype), intent(in)               :: o_info
+  type(ord_infotype), intent(in)             :: ord_info
+  type(int_infotype), intent(in)             :: int_info
+  integer, intent(in)                        :: sz
+  type(ener_infotype), intent(in)            :: ener_info
+  Real(KIND=kd_dble), dimension(:,:), allocatable :: fock
+  Real(kd_dble), dimension(:), allocatable        :: hdiag
+  type(prog_infotype), intent(in)               :: prog_info
+
+  type(deter_dblock), pointer :: d00
+  Real(KIND=kd_dble), dimension(:,:), allocatable ::  h0
+  real(kd_dble), dimension(:,:), allocatable :: vect
+  Integer, dimension(nvectot) :: vguess
+  Logical, dimension(nvec) :: libre
+  Integer :: ngen, nd00
+  Integer :: ivec, jvec, i, igen, indx
+  Real(KIND=kd_dble) :: tmp, tmpmax
+
+  ! check
+  if (nvec.le.nvectot) return
+
+  ! initialisations
+  ngen = nvec - nvectot
+  vguess(:) = 0
+  libre(:)   = .true.
+  nd00 = d%detblock(1)%p%ndet
+  
+  ! compute guess from DOO block
+  call compute_h0(h0, r0, d, fock, hdiag, g_info, o_info, ord_info, &
+       int_info, sz, prog_info)
+  call diag_h0(h0, vect, nd00, ener_info, nvec, prog_info)
+  deallocate(h0)
+
+  ! allocate guess vectors to H0=<D00|H|D00> eigenvectors
+  do ivec = 1,nvectot
+     tmpmax = 0.d0
+     do jvec = 1,nvec
+        tmp = dot_product(vect(1:ndet,jvec) , psi_0_guess(1:ndet,ivec))
+        if (tmpmax.lt.abs(tmp)) then
+           tmpmax = tmp
+           vguess(ivec) = jvec
+        end if
+     end do
+  end do
+
+  ! check non allocated H0 eigenvectors
+  do ivec = 1,nvectot
+     libre(vguess(ivec)) = .false.
+  end do
+
+  ! allocated psi_0_guess(: , nvectot+1:nvec) to H0 non-allocated eigenvectors
+  psi_0_guess(: , nvectot+1:nvec) = 0.d0
+  igen = 0
+  do jvec = 1,nvec
+     if (libre(jvec)) then
+        igen = igen + 1
+        if (igen.gt.ngen) stop " Error in complementary guess" 
+        psi_0_guess(1:nd00,igen+nvectot) = vect(1:nd00,jvec)
+        libre(jvec) = .false.
+     end if
+  end do
+
+  ! verification
+  do jvec = 1,nvec
+     if (libre(jvec)) stop " Error in complementary guess" 
+  end do
+  
+  end subroutine complement_guess
+
+end module gener_guess
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/hole_part_cases.F90 b/src/hole_part_cases.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c7671a13dc8dcb9cde592b2f13374ca3e37a11c0
--- /dev/null
+++ b/src/hole_part_cases.F90
@@ -0,0 +1,196 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module hole_part_cases
+  use info
+  
+  implicit none
+
+  
+  integer(kind=kd_int), parameter :: case_sign_minus = 1
+  integer(kind=kd_int), parameter :: case_sign_1i = 2
+  integer(kind=kd_int), parameter :: case_sign_2i = 4
+  integer(kind=kd_int), parameter :: case_sign_1j = 8
+  integer(kind=kd_int), parameter :: case_sign_2j = 16
+  
+contains
+
+  !$======================================================================== 
+  !> @brief generate the case info (number of diffs and the exponent) for the holes
+  !$======================================================================== 
+  subroutine gener_hole_case_info(h)
+    
+    type(case_infotype) :: h(num_cases)
+
+    integer(kind=kd_int), parameter :: i1 = case_sign_1i
+    integer(kind=kd_int), parameter :: i2 = case_sign_2i
+    integer(kind=kd_int), parameter :: j1 = case_sign_1j
+    integer(kind=kd_int), parameter :: j2 = case_sign_2j
+
+    call fill_ndiffs(h)
+    
+    h(1)%exponent = 0
+    h(2)%exponent = j1 + 1
+    h(3)%exponent = j1 + j2
+    h(4)%exponent = i1 + 1
+    h(5)%exponent = i1 + j1 + 1
+    h(6)%exponent = i1 + j1 + j2 + 1
+    h(7)%exponent = j2 + 1
+    h(8)%exponent = i1 + j1 + j2 + 1
+    h(9)%exponent = 0
+    h(10)%exponent = j1
+    h(11)%exponent = i1 + j1 + 1
+    h(12)%exponent = i1 + j1 + j2 + 1
+    h(13)%exponent = i1 + i2
+    h(14)%exponent = i1 + i2 + j1 + 1
+    h(15)%exponent = i1 + i2 + j1 + j2
+    h(16)%exponent = j2 + i1
+    h(17)%exponent = i1 + i2 + j1 + j2
+    h(18)%exponent = i2 + j2 + 1
+    h(19)%exponent = i1 + i2 + j1 + j2
+    h(20)%exponent = i1
+    h(21)%exponent = i1 + j1 + 1
+    h(22)%exponent = 0
+    h(23)%exponent = i1 + j1 + 1
+    h(24)%exponent = i1 + i2 + j1 + 1
+    h(25)%exponent = i1 + i2 + j1 + j2
+    h(26)%exponent = i2 + j2 + 1
+    h(27)%exponent = i1 + i2 + j1 + j2
+    h(28)%exponent = i2 + 1
+    h(29)%exponent = i2 + j1
+    h(30)%exponent = i1 + i2 + j1 + 1
+    h(31)%exponent = i1 + i2 + j1 + j2
+  end subroutine gener_hole_case_info
+
+
+  !$======================================================================== 
+  !> @brief generate the case info (number of diffs and the exponent) for the particles
+  !$======================================================================== 
+  subroutine gener_part_case_info(p, nelact) 
+    integer, intent(in) :: nelact
+    type(case_infotype) :: p(num_cases)
+
+    call fill_ndiffs(p)
+    
+    p(1)%exponent = 0
+    p(2)%exponent = modulo(nelact + 1, 2)
+    p(3)%exponent = 0
+    p(4)%exponent = modulo(nelact + 1, 2)
+    p(5)%exponent = 0
+    p(6)%exponent = modulo(nelact + 1, 2)
+    p(7)%exponent = modulo(nelact, 2)
+    p(8)%exponent = modulo(nelact + 1, 2)
+    p(9)%exponent = 0
+    p(10)%exponent = modulo(nelact + 1, 2)
+    p(11)%exponent = 0
+    p(12)%exponent = modulo(nelact + 1, 2)
+    p(13)%exponent = 0
+    p(14)%exponent = modulo(nelact + 1, 2)
+    p(15)%exponent = 0
+    p(16)%exponent = 1
+    p(17)%exponent = 0
+    p(18)%exponent = 0
+    p(19)%exponent = 0
+    p(20)%exponent = modulo(nelact + 1, 2)
+    p(21)%exponent = 0
+    p(22)%exponent = 0
+    p(23)%exponent = 0
+    p(24)%exponent = modulo(nelact + 1, 2)
+    p(25)%exponent = 0
+    p(26)%exponent = 0
+    p(27)%exponent = 0
+    p(28)%exponent = modulo(nelact, 2)
+    p(29)%exponent = 1
+    p(30)%exponent = modulo(nelact + 1, 2)
+    p(31)%exponent = 0
+  end subroutine gener_part_case_info
+
+
+  !$======================================================================== 
+  !> @brief Resolve the sign of a hole case based on the exponent expression and
+  !! the given values 1i, 2i, 1j, 2j
+  !$======================================================================== 
+  function calc_hole_sign(case, h_i1, h_i2, h_j1, h_j2) result(sign)
+    type(case_infotype), intent(in) :: case
+    integer, intent(in) :: h_i1, h_i2, h_j1, h_j2
+    integer :: exponent
+    integer :: sign
+
+    ! Add 0 or 1 to exponent for each contribution
+    exponent = iand(case%exponent, case_sign_minus) / case_sign_minus + &
+         modulo(h_i1, 2) * iand(case_sign_1i, case%exponent) / case_sign_1i + &
+         modulo(h_i2, 2) * iand(case_sign_2i, case%exponent) / case_sign_2i + &
+         modulo(h_j1, 2) * iand(case_sign_1j, case%exponent) / case_sign_1j + &
+         modulo(h_j2, 2) * iand(case_sign_2j, case%exponent) / case_sign_2j
+
+    sign = 1 - 2 * modulo(exponent, 2)
+  end function calc_hole_sign
+
+  
+  !$======================================================================== 
+  !> @brief Add the number of differences to the case (same for holes and particles)
+  !$======================================================================== 
+  subroutine fill_ndiffs(cases)
+    type(case_infotype), intent(inout) :: cases(num_cases)
+
+    cases(1)%ndiffs = 0
+    cases(2)%ndiffs = 1
+    cases(3)%ndiffs = 2
+    cases(4)%ndiffs = 1
+    cases(5)%ndiffs = 2
+    cases(6)%ndiffs = 3
+    cases(7)%ndiffs = 1
+    cases(8)%ndiffs = 3
+    cases(9)%ndiffs = 0
+    cases(10)%ndiffs = 1
+    cases(11)%ndiffs = 2
+    cases(12)%ndiffs = 3
+    cases(13)%ndiffs = 2
+    cases(14)%ndiffs = 3
+    cases(15)%ndiffs = 4
+    cases(16)%ndiffs = 2
+    cases(17)%ndiffs = 4
+    cases(18)%ndiffs = 2
+    cases(19)%ndiffs = 4
+    cases(20)%ndiffs = 1
+    cases(21)%ndiffs = 2
+    cases(22)%ndiffs = 0
+    cases(23)%ndiffs = 2
+    cases(24)%ndiffs = 3
+    cases(25)%ndiffs = 4
+    cases(26)%ndiffs = 2
+    cases(27)%ndiffs = 4
+    cases(28)%ndiffs = 1
+    cases(29)%ndiffs = 2
+    cases(30)%ndiffs = 3
+    cases(31)%ndiffs = 4
+  end subroutine fill_ndiffs
+  
+end module
+  
diff --git a/src/hv_blocs.F90 b/src/hv_blocs.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b780e9620cea24474cea0b4ad5c43e87c314985f
--- /dev/null
+++ b/src/hv_blocs.F90
@@ -0,0 +1,4207 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module blocs_hv
+
+  use info
+  use detact
+  use hole_part_cases
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_intcase
+  use utils_wrt
+  use typetargetvec
+  use typebraket
+  use blocs_hv_int
+
+  implicit none
+
+contains
+
+  !!============================================================ 
+  !> @brief Add the contribution HV to W from a given integral
+  !! type and 2 given blocks I and J
+  !! Wm_J = H_JI Vm_I
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !
+  !> @param VmI Subblock of m Davidson vectors matching block I
+  !> @param spinrefI List of the spin-ordered active parts of the det in DblockI
+  !> @param DblockI Determinant block I D_m^n
+  !> @param indxI Index of DblockI in the list of all determinant blocks
+  !> @param WmJ Subblock of the NEW Davidson vectors matching block J
+  !> @param spinrefJ List of the spin-ordered active parts of the det in DblockJ
+  !> @param DblockJ Determinant block J D_m^n
+  !> @param indxJ Index of DblockJ in the list of all determinant blocks
+  !> @param fock Fock matrix
+  !> @param o_info Orbital information
+  !> @param nelact Nb of active electrons
+  !> @param hcase_info Info about the different hole cases
+  !> @param pcase_info Info about the different particle cases
+  !> @param intkind all info needed to build H for that integral kind 
+  !> @param twoint Integral block
+  !> @param twointx Exchange integral block  
+  !!============================================================
+  subroutine hv_blocs(VmI, spinrefI, dblockI, indxI, &
+       WmJ, spinrefJ, dblockJ, indxJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, &
+       intkind, twoint, twointx, intcases, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact, indxI, indxJ
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+
+    integer :: i
+    logical :: ldebug = .true.
+    type(braket) :: Hij
+
+
+!!$    write(667,*)
+!!$    write(667,*) &
+!!$         '>>> ==================================================='
+!!$    write(667,'(A,A,A,I0,A,I0)') &
+!!$         ' >>> ',intkind%name,' contribution to the block D',&
+!!$         DblockI%name,'-D',DBlockJ%name
+!!$    write(667,*) &
+!!$         '>>> ================================================'
+       
+    call braket_init(Hij)
+    Hij%blockIshift = DblockI%shift
+    Hij%blockJshift = DblockJ%shift
+           
+    if (dblockI%nexcVirt .eq. 0) then
+       call hv_blocs_0pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, &
+            twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockI%nexcVirt .eq. 1) then
+       call hv_blocs_1pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, &
+            twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockI%nexcVirt .eq. 2) then
+       call hv_blocs_2pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, &
+            twointx, intcases, Hij, ldebug, Hmat)
+    endif
+
+  end subroutine hv_blocs
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with no particles
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_0pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, twointx, &
+       intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    
+    Hij%detshiftI = 0 !DblockI%shift
+    Hij%spinpI = 0
+
+    call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+         fock, o_info, nelact, hcase_info, &
+         pcase_info, intkind, twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+  end subroutine hv_blocs_0pI
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with one particles
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_1pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, twointx, &
+       intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    integer :: isftp, p1
+    integer :: detshiftI, spinpI
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    isftp = (ngel+nocc+nligo+nact)
+
+    Hij%detshiftI = 0 !DblockI%shift
+
+    !up 
+    Hij%spinpI = -1
+    do p1 = isftp + 1, isftp + nligv + nvirt
+       Hij%p1 = p1
+       Hij%spinp1 = 1
+       call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, &
+            pcase_info, intkind, twoint, twointx, intcases, Hij, ldebug, Hmat)
+    enddo
+
+    !dn
+    Hij%spinpI = 1
+    do p1 = isftp + 1, isftp + nligv + nvirt
+       Hij%p1 = p1
+       Hij%spinp1 = -1
+       call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, &
+            pcase_info, intkind, twoint, twointx, intcases, Hij, ldebug, Hmat)
+    enddo
+
+  end subroutine hv_blocs_1pI
+
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with two particles
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_2pI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, twoint, twointx, &
+       intcases, Hij, ldebug, Hmat)
+  
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    integer :: isftp, p1, p2
+    integer :: detshiftI, spinpI
+    
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    isftp = (ngel+nocc+nligo+nact)
+
+    Hij%detshiftI = 0 !DblockI%shift
+
+    !up up
+    Hij%spinpI = -2
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          Hij%p1 = p1
+          Hij%spinp1 = 1
+          Hij%p2 = p2
+          Hij%spinp2 = 1
+          call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+
+    !p1up p2dn ligvup ligvdn, ligvup virtdn
+    Hij%spinpI = 0
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       do p1 = isftp + 1, isftp + nligv
+          Hij%p1 = p1
+          Hij%spinp1 = 1
+          Hij%p2 = p2
+          Hij%spinp2 = -1
+          call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind,&
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       end do
+    end do
+
+    !p1up p2dn virtup ligvdn
+    Hij%spinpI = 0
+    do p2 = isftp + 1, isftp + nligv 
+       do p1 = isftp + nligv + 1, isftp + nligv + nvirt
+          Hij%p1 = p1
+          Hij%spinp1 = 1
+          Hij%p2 = p2
+          Hij%spinp2 = -1
+          call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind,&
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       end do
+    end do
+
+    !dn dn
+    Hij%spinpI = +2
+    do p2 = isftp + 1, isftp + nligv + nvirt
+       do p1 = isftp + 1, min(p2-1, isftp + nligv)
+          Hij%p1 = p1
+          Hij%spinp1 = -1
+          Hij%p2 = p2
+          Hij%spinp2 = -1
+          call hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+    
+  end subroutine hv_blocs_2pI
+
+  
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_pIspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    
+    if (dblockI%nexcOcc .eq. 0) then
+       call hv_blocs_0hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockI%nexcOcc .eq. 1) then
+       call hv_blocs_1hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockI%nexcOcc .eq. 2) then
+       call hv_blocs_2hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    endif
+
+  end subroutine hv_blocs_pIspin
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with no holes
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_0hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    Hij%spinI = Hij%spinpI
+
+    call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+         fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+         twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+  end subroutine hv_blocs_0hI
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with 1 hole
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_1hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    !integer :: spinI
+    integer :: isfth, t1
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+
+    isfth = ngel
+    !up
+    Hij%spinI = Hij%spinpI + 1
+    do t1 = isfth + 1, isfth+nocc+nligo
+       Hij%t1 = t1
+       Hij%spint1 = +1
+       call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    enddo
+
+    !dn
+    Hij%spinI = Hij%spinpI - 1
+    do t1 = isfth + 1, isfth+nocc+nligo
+       Hij%t1 = t1
+       Hij%spint1 = -1
+       call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    enddo
+
+  end subroutine hv_blocs_1hI
+
+  
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detI with 2 holes
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_2hI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+    
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    !integer :: spinI, spint1, spint2
+    integer :: isfth, t1, t2
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    isfth = ngel
+
+    !up up
+    Hij%spinI = Hij%spinpI + 2
+    do t2 = isfth + 1, isfth+nocc+nligo
+       Hij%t2 = t2
+       Hij%spint2 = +1
+       do t1 = max(t2+1,isfth+nocc+1), isfth+nocc+nligo
+          Hij%t1 = t1
+          Hij%spint1 = +1
+          call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+
+    !t1dn t2up occup ligodn, ligoup ligodn
+    Hij%spinI = Hij%spinpI
+    do t2 = isfth + 1, isfth+nocc+nligo
+       Hij%t2 = t2
+       Hij%spint2 = +1
+       do t1 = isfth + nocc + 1, isfth + nocc+nligo
+          Hij%t1 = t1
+          Hij%spint1 = -1
+          call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+
+    !t1dn t2up ligoup occdn
+    Hij%spinI = Hij%spinpI
+    do t2 = isfth + nocc + 1, isfth+nocc+nligo
+       Hij%t2 = t2
+       Hij%spint2 = +1
+       do t1 = isfth + 1, isfth + nocc
+          Hij%t1 = t1
+          Hij%spint1 = -1
+          call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+
+    !dn dn
+    Hij%spinI = Hij%spinpI - 2
+    do t2 = isfth + 1, isfth + nocc+nligo
+       Hij%t2 = t2
+       Hij%spint2 = -1
+       do t1 = max(t2+1, isfth + nocc +1), isfth + nocc+nligo
+          Hij%t1 = t1
+          Hij%spint1 = -1
+          call hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+    enddo
+    
+  end subroutine hv_blocs_2hI
+  
+
+  !!============================================================ 
+  !> @brief Add the active Fock part to HV for detI
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_actI(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ,& 
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: indxI, isftI, ndetactI
+    integer :: i
+
+
+    indxI = get_spinCatindx(spinrefI, Hij%spinI)
+    isftI = spinrefI%ShiftSpinCat(indxI)
+    ndetactI = spinrefI%NdetSpinCat(indxI)
+
+    Hij%spinshiftI = isftI  
+       
+    if (dblockJ%nexcVirt .eq. 0) then
+       do i = 1, ndetactI
+          Hij%idetactI = isftI+i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          call hv_blocs_0pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       end do
+    else if (dblockJ%nexcVirt .eq. 1) then
+       do i = 1, ndetactI
+          Hij%idetactI = isftI+i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          call hv_blocs_1pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       end do
+    else if (dblockJ%nexcVirt .eq. 2) then
+       do i = 1, ndetactI
+          Hij%idetactI = isftI+i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          call hv_blocs_2pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       end do
+    endif
+    
+    Hij%detshiftI = Hij%detshiftI + ndetactI
+
+  end subroutine hv_blocs_actI
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with no particles
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_0pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    
+    Hij%detshiftJ = 0 !DblockJ%shift
+    Hij%spinpJ = 0
+
+    if (Hij%p1.eq.0) then
+       Hij%pcase = 1
+    else if (Hij%p2.eq.0) then
+       Hij%pcase = 4
+    else
+       Hij%pcase = 13
+    endif
+
+    call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+         fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+         twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+  end subroutine hv_blocs_0pJ
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with one particle
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_1pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    integer :: isftp, p3!, pcase 
+    !integer :: detshiftJ, spinpJ, spinp3
+
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    isftp = (ngel+nocc+nligo+nact)
+
+    Hij%detshiftJ = 0 !DblockJ%shift
+
+    !Case p1 = 0, p2 = 0
+    if (Hij%p1.eq.0) then
+       
+       Hij%pcase = 2
+       !up
+       Hij%spinpJ = -1
+       do p3 = isftp + 1, isftp + nligv + nvirt
+          Hij%p3 = p3
+          Hij%spinp3 = +1
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+
+       !dn
+       Hij%spinpJ = 1
+       do p3 = isftp + 1, isftp + nligv + nvirt
+          Hij%p3 = p3
+          Hij%spinp3 = -1
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+
+       !Case p1 != 0, p2 = 0   
+    else if (Hij%p2.eq.0) then
+       if (Hij%spinp1.eq.1) then
+          !up
+          Hij%spinpJ = -1
+          !p3 < p1
+          Hij%pcase = 5
+          do p3 = isftp + 1, Hij%p1-1
+             Hij%p3 = p3
+             Hij%spinp3 = +1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !p3 = p1
+          Hij%p3 = Hij%p1
+          Hij%spinp3 = +1
+          Hij%pcase = 9
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+          !p3 > p1
+          Hij%pcase = 11
+          do p3 = Hij%p1+1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             Hij%spinp3 = +1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !dn
+          Hij%spinpJ = 1
+          Hij%pcase = 11
+          do p3 = isftp + 1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             Hij%spinp3 = -1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       else
+          !up
+          Hij%spinpJ = -1
+          Hij%pcase = 5
+          do p3 = isftp + 1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             Hij%spinp3 = +1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !dn
+          Hij%spinpJ = 1
+          !p3 < p1
+          Hij%pcase = 5 
+          do p3 = isftp + 1, Hij%p1-1
+             Hij%p3 = p3
+             Hij%spinp3 = -1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          !p3 = p1
+          Hij%p3 = Hij%p1
+          Hij%spinp3 = -1
+          Hij%pcase = 9
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+          !p3 < p1
+          Hij%pcase = 11
+          do p3 = Hij%p1+1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             Hij%spinp3 = -1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       endif
+       ! General case, p1 != 0, p2 != 0  
+    else
+       if (Hij%spinp1 .eq. 1) then
+          if (Hij%spinp2 .eq. 1) then ! UU
+             ! UUU
+             Hij%spinp3 = 1
+             Hij%spinpJ = -1
+             
+             Hij%pcase = 14
+             do p3 = isftp + 1, Hij%p1 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 20
+             Hij%p3 = Hij%p1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+             Hij%pcase = 24
+             do p3 = Hij%p1 + 1, Hij%p2 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 28
+             Hij%p3 = Hij%p2
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+             Hij%pcase = 30
+             do p3 = Hij%p2 + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             ! UUD
+             Hij%spinp3 = -1
+             Hij%spinpJ = 1
+             
+             Hij%pcase = 30
+             do p3 = isftp + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          else ! UD
+             ! UDU
+             Hij%spinp3 = 1
+             Hij%spinpJ = -1
+             
+             Hij%pcase = 14
+             do p3 = isftp + 1, Hij%p1 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 20
+             Hij%p3 = Hij%p1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+             Hij%pcase = 24
+             do p3 = Hij%p1 + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             ! UDD
+             Hij%spinp3 = -1
+             Hij%spinpJ = 1
+
+             Hij%pcase = 24
+             do p3 = isftp + 1, Hij%p2 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 28
+             Hij%p3 = Hij%p2
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+             Hij%pcase = 30
+             do p3 = Hij%p2 + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end if
+       else
+          if (Hij%spinp2 .eq. 1) then ! DU
+             ! Not possible
+          else ! DD
+             ! DDU
+             Hij%spinp3 = 1
+             Hij%spinpJ = -1
+
+             Hij%pcase = 14
+             do p3 = isftp + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             ! DDD
+             Hij%spinp3 = -1
+             Hij%spinpJ = 1
+
+             Hij%pcase = 14
+             do p3 = isftp + 1, Hij%p1 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)                
+             end do
+
+             Hij%pcase = 20
+             Hij%p3 = Hij%p1
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+             Hij%pcase = 24
+             do p3 = Hij%p1 + 1, Hij%p2 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 28
+             Hij%p3 = Hij%p2
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+             Hij%pcase = 30
+             do p3 = Hij%p2 + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end if
+       end if
+    endif
+
+  end subroutine hv_blocs_1pJ
+
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with two particles
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_2pJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+    
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    integer :: isftp, p3, p4!, pcase 
+    !integer :: detshiftJ, spinpJ, spinp3, spinp4
+
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ntot = o_info%ntot
+    isftp = (ngel+nocc+nligo+nact)
+        
+    Hij%detshiftJ = 0 !DblockJ%shift
+
+    !Case p1 = 0, p2 = 0
+    if (Hij%p1.eq.0) then
+       Hij%pcase = 3 ! p3 < p4
+
+       ! 00UU
+       Hij%spinp3 = 1
+       Hij%spinp4 = 1
+       Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+       do p4 = isftp + 1, isftp + nligv + nvirt
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4-1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+       end do
+       
+       ! 00UD
+       Hij%spinp3 = 1
+       Hij%spinp4 = -1
+       Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+       !Case p3 in ligvU and p4 in ligvD+virtD
+       do p4 = isftp + 1, isftp + nligv + nvirt
+          Hij%p4 = p4
+          do p3 = isftp + 1, isftp + nligv
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+       end do
+
+       !Case p3 in virtU and p4 in ligvD
+       do p4 = isftp + 1, isftp + nligv
+          Hij%p4 = p4
+          do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+       end do
+       
+       ! 00DD
+       Hij%spinp3 = -1
+       Hij%spinp4 = -1
+       Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+       do p4 = isftp + 1, isftp + nligv + nvirt
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4-1, isftp + nligv)
+             Hij%p3 =p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+       end do
+
+    else if (Hij%p2 .eq. 0) then
+       ! 1 particle in I
+       if (Hij%spinp1 .eq. 1) then
+          ! U0UU
+          Hij%spinp3 = 1
+          Hij%spinp4 = 1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 6, 7, 8, 10, 12
+
+          !***p4 < p1
+          Hij%pcase = 6 !p3 < p4 < p1
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          !***p4 = p1
+          Hij%pcase = 7 !p3 < p4 = p1
+          Hij%p4 = Hij%p1
+          do p3 = isftp + 1, min(Hij%p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          !***p4 > p1
+          Hij%pcase = 8 !p3 < p1 < p4
+          do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          
+             if (Hij%p1 .le. isftp + nligv) then !because p3 in ligv
+                Hij%pcase = 10 !p1 = p3 < p4
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                      
+                Hij%pcase = 12 !p1 < p3 < p4
+                do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             endif
+          enddo
+
+          ! U0UD
+          Hij%spinp3 = 1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 8, 10, 12
+
+          if (Hij%p1 <= isftp + nligv) then
+             !p1 is ligvU
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             
+             Hij%pcase = 8 !p3 < p1 < p4
+             do p4 = isftp + 1, isftp + nligv + nvirt
+                Hij%p4 = p4
+                do p3 = isftp + 1, Hij%p1 - 1
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+                          
+                Hij%pcase = 10 !p3 = p1 < p4
+             
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+                Hij%pcase = 12 !p1 < p3 < p4
+             
+                do p3 = Hij%p1 + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+
+             !Case p3 in virtU and p4 in ligvD
+             do p4 = isftp + 1, isftp + nligv 
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+             
+          else
+             ! p1 is virtU
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             Hij%pcase = 8 !p3 < p1 < p4
+             do p4 = isftp + 1, isftp + nligv + nvirt
+                Hij%p4 = p4
+                do p3 = isftp + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+
+             !Case p3 in virtU and p4 in ligvD
+             Hij%pcase = 8 !p3 < p1 < p4
+             do p4 = isftp + 1, isftp + nligv
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, Hij%p1 - 1
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             
+                Hij%pcase = 10 !p3 = p1 < p4
+                Hij%p3 = Hij%p1 
+             
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+                Hij%pcase = 12 !p1 < p3 < p4
+             
+                do p3 = Hij%p1 + 1, isftp + nligv + nvirt
+                   Hij%p3 =p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+          end if
+          
+          ! U0DD
+          Hij%spinp3 = -1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 12
+          Hij%pcase = 12 !p1 < p3 < p4
+          do p4 = isftp + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+          
+          
+       else ! spinp1 == -1
+          ! D0UU
+          Hij%spinp3 = 1
+          Hij%spinp4 = 1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 6
+          Hij%pcase = 6 ! p3 < p4 < p1
+          do p4 = isftp + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          ! D0UD  
+          Hij%spinp3 = 1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 6, 7, 8
+          
+          !p1 is ligvD+virtD
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          Hij%pcase = 6
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+          
+          Hij%pcase = 7
+          Hij%p4 = Hij%p1
+          do p3 = isftp + 1, isftp + nligv
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          Hij%pcase = 8
+          do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+          
+          !Case p3 in virtU and p4 in ligvD
+          Hij%pcase = 6
+          do p4 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+             Hij%p4 = p4
+             do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+          
+          if (Hij%p1 <= isftp + nligv) then
+             ! p1 is ligv
+             Hij%pcase = 7
+             Hij%p4 = Hij%p1
+             do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 8
+             do p4 = Hij%p1 + 1, isftp + nligv 
+                 Hij%p4 = p4
+                do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind,&
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+          end if
+          
+
+          ! D0DD
+          Hij%spinp3 = -1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          ! pcases 6, 7, 8, 10, 12
+          
+          Hij%pcase = 6 !p3 < p4 < p1
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          Hij%pcase = 7 !p3 < p4 = p1
+          p4 = Hij%p1
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          Hij%pcase = 8 !p3 < p1 < p4
+          do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          
+             if (Hij%p1 .le. isftp + nligv) then
+                Hij%pcase = 10  !p1 = p3 < p4
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+                Hij%pcase = 12 !p1 < p3 < p4
+             
+                do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                        WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             endif
+          enddo
+       end if
+    else
+       !2 particles in I
+       if ((Hij%spinp1 .eq. 1) .and. (Hij%spinp2 .eq. 1)) then
+          !UUUU
+          Hij%spinp3=1
+          Hij%spinp4=1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+
+
+          !*** p4 < p1
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          !*** p4 = p1
+          Hij%pcase = 16 !p3<p4=p1<p2
+          p4 = Hij%p1
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                  WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          !*** p1 < p4 < p2
+          Hij%pcase = 17 !p3<p1<p4<p2
+          do p4 = Hij%p1 + 1, Hij%p2-1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             Hij%pcase = 21 !p3=p1<p4<p2
+          
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+                    
+             Hij%pcase = 25 !p1<p3<p4<p2
+          
+             do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          !*** p4 = p2 
+          Hij%pcase = 18 !p3<p1<p4=p2
+          p4 = Hij%p2
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          Hij%pcase = 22 !p1=p3<p2=p4
+          
+          p3 = Hij%p1
+          Hij%p3 = p3
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+               spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+
+          Hij%pcase = 26 !p1<p3<p4=p2
+          
+          do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !*** p4 > p2
+          Hij%pcase = 19 !p3<p1<p2<p4
+          do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+                    
+             Hij%pcase = 23 !p1=p3<p2<p4
+          
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+         
+             Hij%pcase = 27 !p1<p3<p2<p4
+          
+             do p3 = Hij%p1 + 1, min(Hij%p2 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          
+             if (Hij%p2 .le. isftp + nligv) then
+                Hij%pcase = 29 !p1<p2=p3<p4
+             
+                p3 = Hij%p2
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                          
+                Hij%pcase = 31 !p1<p2<p3<p4
+             
+                do p3 = Hij%p2 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             endif
+          enddo
+
+          !UUUD
+          Hij%spinp3 = 1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          !p1 in ligvU and p2 in ligvU+virtU         
+          
+          do p4 = isftp + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             Hij%pcase = 19 !p3<p1<p2<p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+        
+             Hij%pcase = 23 !p1=p3<p2<p4
+          
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+             Hij%pcase = 27 !p1<p3<p2<p4
+          
+             do p3 = Hij%p1 + 1, min(Hij%p2 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          
+             
+             if (Hij%p2 .le. isftp + nligv) then
+             
+                p3 = Hij%p2
+                Hij%p3 = p3
+                Hij%pcase = 29 !p1<p2=p3<p4
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+                Hij%pcase = 31 !p1<p2<p3<p4
+                
+                do p3 = Hij%p2 + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             endif
+          enddo
+          
+          !Case p3 in virtU and p4 in ligvD
+          !p1 in ligvU and p2 in ligvU+virtU
+          do p4 = isftp + 1, isftp + nligv
+             Hij%p4 = p4
+             if (Hij%p2 .gt. isftp + nligv) then !if p2 in virtU
+                Hij%pcase = 27 !p1<p3<p2<p4
+                
+                do p3 = isftp + nligv + 1, Hij%p2 - 1
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             !enddo
+          
+                Hij%pcase = 29 !p1<p2=p3<p4
+             !do p4 = isftp + 1, isftp + nligv 
+             !   Hij%p4 = p4
+                p3 = Hij%p2
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             !enddo
+             endif
+             
+             Hij%pcase = 31 !p1<p2<p3<p4
+          !do p4 = isftp + 1, isftp + nligv
+          !   Hij%p4 = p4
+             do p3 = max(Hij%p2 + 1, isftp + nligv + 1), isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+          
+          
+          Hij%spinp3 = -1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          !UUDD
+          !p1 in ligvU p2 in ligvU+virtU
+          !p3 in ligvD p4 in ligvD+virtD
+          Hij%pcase = 31 !p1<p2<p3<p4
+          do p4 = isftp + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4-1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          
+       else if ((Hij%spinp1 .eq. 1) .and. (Hij%spinp2 .eq. -1)) then
+          Hij%spinp3 = 1
+          Hij%spinp4 = 1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          !UDUU
+          
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          !Case p1 in virtU and p2 in ligvD
+
+          !p3 in ligvU and p4 in ligvU+virtU
+
+          !*** p4 < p1
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, Hij%p1 -1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4-1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          !*** p4 = p1
+          Hij%pcase = 16 !p3<p4=p1<p2
+          Hij%p4 = Hij%p1
+          do p3 = isftp + 1, min(p4-1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          !*** p1 < p4 < p2
+          Hij%pcase = 17 !p3<p1<p4<p2
+          do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1-1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          !end do
+
+
+             if( Hij%p1 .le. isftp + nligv) then
+                Hij%pcase = 21 !p3=p1<p4<p2
+                !do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+                !   Hij%p4 = p4
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             !end do
+             
+                Hij%pcase = 25 !p1<p3<p4<p2
+             !do p4 = Hij%p1 + 1, isftp + nligv + nvirt
+             !   Hij%p4 = p4
+                do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             endif
+          enddo
+
+
+          
+          !UDUD
+          Hij%spinp3 = 1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          !Case p1 in ligvU and p2 in ligvD+virtD
+          if( Hij%p1 .le. isftp + nligv) then
+             
+             
+
+             !*** p4 < p2
+             do p4 =  isftp + 1, Hij%p2-1
+                Hij%p4 = p4
+                !Case p3 in ligvU and p4 in ligvD+virtD
+                Hij%pcase = 17 !p3<p1<p4<p2
+                do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+                          
+                Hij%pcase = 21 !p3=p1<p4<p2
+                !Case p3 in ligvU and p4 in ligvD+virtD
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                                      
+                Hij%pcase = 25 !p1<p3<p4<p2
+                !Case p3 in ligvU and p4 in ligvD+virtD
+                do p3 = Hij%p1 + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** p4 = p2          
+             Hij%pcase = 18 !p3<p1<p4=p2
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             p4 = Hij%p2
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+             
+             Hij%pcase = 22 !p1=p3<p2=p4
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+             
+             Hij%pcase = 26 !p1<p3<p4=p2
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             do p3 = Hij%p1 + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+
+             !*** p4 > p2
+             Hij%pcase = 19 !p3<p1<p2<p4
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+                Hij%p4 = p4
+                do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+                          
+                Hij%pcase = 23 !p1=p3<p2<p4
+                !Case p3 in ligvU and p4 in ligvD+virtD
+                Hij%p3 = Hij%p1
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                         
+                Hij%pcase = 27 !p1<p3<p2<p4
+                !Case p3 in ligvU and p4 in ligvD+virtD
+                do p3 = Hij%p1 + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+
+             ! *** p4 < p2
+             Hij%pcase = 25 !p1<p3<p4<p2
+             !Case p1 in ligvU and p2 in ligvD+virtD
+             !Case p3 in virtU and p4 in ligvD
+             do p4 = isftp + 1, min(Hij%p2 -1, isftp + nligv)
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             if (Hij%p2 .le. isftp + nligv) then
+                Hij%pcase = 26 !p1<p3<p4=p2
+                !Case p3 in virtU and p4 in ligvD
+                Hij%p4 = Hij%p2
+                do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%pcase = 27 !p1<p3<p2<p4
+                !Case p3 in virtU and p4 in ligvD
+                do p4 = Hij%p2 + 1, isftp + nligv 
+                   Hij%p4 = p4
+                   do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                      Hij%p3 = p3
+                      call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                           spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             endif
+
+          
+          else !Case p1 in virtU and p2 in ligvD
+             !*** p4 < p2
+             Hij%pcase = 17 !p3<p1<p4<p2
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             do p4 = isftp + 1, Hij%p2-1
+                Hij%p4 = p4
+                do p3 = isftp + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+
+             !*** p4 = p2
+             Hij%pcase = 18 !p3<p1<p4=p2
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             p4 = Hij%p2
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             !*** p4 < p2
+             Hij%pcase = 19 !p3<p1<p2<p4
+             !Case p3 in ligvU and p4 in ligvD+virtD
+             do p4 = Hij%p2+1, isftp + nligv + nvirt
+                Hij%p4 = p4
+                do p3 = isftp + 1, isftp + nligv
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+
+
+             !*** p4 < p2
+             Hij%pcase = 17 !p3<p1<p4<p2
+             !Case p1 in virtU and p2 in ligvD
+             !Case p3 in virtU and p4 in ligvD
+             do p4 =  isftp + 1, Hij%p2-1
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, Hij%p1 - 1
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+                          
+                Hij%pcase = 21 !p3=p1<p4<p2
+                !Case p3 in virtU and p4 in ligvD
+                p3 = Hij%p1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                          
+                Hij%pcase = 25 !p1<p3<p4<p2
+                !Case p3 in virtU and p4 in ligvD
+                do p3 = Hij%p1 + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+
+             !*** p4 = p2
+             Hij%pcase = 18 !p3<p1<p4=p2
+             !Case p3 in virtU and p4 in ligvD
+             p4 = Hij%p2
+             Hij%p4 = p4
+             do p3 = isftp + nligv + 1, Hij%p1 - 1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+             
+             Hij%pcase = 22 !p1=p3<p2=p4
+             !Case p3 in virtU and p4 in ligvD
+             p3 = Hij%p1 
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+             Hij%pcase = 26 !p1<p3<p4=p2
+             !Case p3 in virtU and p4 in ligvD
+             do p3 = Hij%p1 + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+
+             !*** p4 > p2
+             Hij%pcase = 19 !p3<p1<p2<p4
+             !Case p3 in virtU and p4 in ligvD
+             do p4 = Hij%p2+1, isftp + nligv
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, Hij%p1 - 1
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             
+                Hij%pcase = 23 !p1=p3<p2<p4
+                !Case p3 in virtU and p4 in ligvD
+                p3 = Hij%p1
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                          
+                Hij%pcase = 27 !p1<p3<p2<p4
+                !Case p3 in virtU and p4 in ligvD
+                do p3 = Hij%p1 + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             end do
+          endif
+             
+          !UDDD
+          Hij%spinp3 = -1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          Hij%pcase = 25 !p1<p3<p4<p2
+          do p4 = isftp + 1, Hij%p2 -1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          Hij%pcase = 26 !p1<p3<p4=p2
+          p4 = Hij%p2
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+
+          !*** p4 > p2
+          Hij%pcase = 27 !p1<p3<p2<p4
+          do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p2 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          
+             if (Hij%p2 .le. isftp + nligv) then
+                Hij%pcase = 29 !p1<p2=p3<p4
+                Hij%p3 = Hij%p2
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                          
+                Hij%pcase = 31 !p1<p2<p3<p4
+                do p3 = Hij%p2 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             endif
+          enddo
+       else
+          !DDUU
+          Hij%spinp3 = 1
+          Hij%spinp4 = 1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4-1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          !DDUD
+          Hij%spinp3 = 1
+          Hij%spinp4 = -1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+          !Case p3 in ligvU and p4 in ligvD+virtD
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+
+          Hij%pcase = 16 !p3<p4=p1<p2
+          p4 = Hij%p1
+          Hij%p4 = p4
+          do p3 = isftp + 1, isftp + nligv
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          Hij%pcase = 17 !p3<p1<p4<p2
+          do p4 = Hij%p1 + 1, Hij%p2 -1
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+
+          Hij%pcase = 18 !p3<p1<p4=p2
+          p4 = Hij%p2
+          Hij%p4 = p4
+          do p3 = isftp + 1, isftp + nligv
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+          
+
+          Hij%pcase = 19 !p3<p1<p2<p4
+          do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, isftp + nligv
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+
+
+          !Case p3 in virtU and p4 in ligvD
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+
+          Hij%pcase = 16 !p3<p4=p1<p2
+          p4 = Hij%p1
+          Hij%p4 = p4
+          do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          
+          Hij%pcase = 17 !p3<p1<p4<p2
+          do p4 = Hij%p1 + 1, min(Hij%p2 - 1, isftp + nligv) 
+             Hij%p4 = p4
+             do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          enddo
+
+          if (Hij%p2 .le. isftp + nligv) then
+             Hij%pcase = 18 !p3<p1<p4=p2
+             p4 = Hij%p2
+             Hij%p4 = p4
+             do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+             
+             Hij%pcase = 19 !p3<p1<p2<p4
+             do p4 = Hij%p2 + 1, isftp + nligv 
+                Hij%p4 = p4
+                do p3 = isftp + nligv + 1, isftp + nligv + nvirt
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                end do
+             enddo
+          endif
+             
+          !DDDD
+          Hij%spinp3=-1
+          Hij%spinp4=-1
+          Hij%spinpJ = -(Hij%spinp3 + Hij%spinp4)
+
+          Hij%pcase = 15 !p3<p4<p1<p2
+          do p4 = isftp + 1, Hij%p1 - 1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                     WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          end do
+
+          Hij%pcase = 16 !p3<p4=p1<p2
+          p4 = Hij%p1
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, &
+                  WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+                    
+          Hij%pcase = 17 !p3<p1<p4<p2
+          do p4 = Hij%p1 + 1, Hij%p2-1
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          !end do
+
+          Hij%pcase = 21 !p3=p1<p4<p2
+          !do p4 = Hij%p1 + 1, Hij%p2 -1
+          !   Hij%p4 = p4
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          !enddo
+
+          Hij%pcase = 25 !p1<p3<p4<p2
+          !do p4 = Hij%p1 + 1, Hij%p2 -1
+          !   Hij%p4 = p4
+             do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          Hij%pcase = 18 !p3<p1<p4=p2
+          p4 = Hij%p2
+          Hij%p4 = p4
+          do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          end do
+
+          Hij%pcase = 22 !p1=p3<p2=p4
+          !p4 = Hij%p2
+          !Hij%p4 = p4
+          p3 = Hij%p1
+          Hij%p3 = p3
+          call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+               spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+
+          Hij%pcase = 26 !p1<p3<p4=p2
+          !p4 = Hij%p2
+          !Hij%p4 = p4
+          do p3 = Hij%p1 + 1, min(p4 - 1, isftp + nligv)
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          
+          Hij%pcase = 19 !p3<p1<p2<p4
+          do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+             Hij%p4 = p4
+             do p3 = isftp + 1, min(Hij%p1 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             end do
+          !enddo
+          
+          Hij%pcase = 23 !p1=p3<p2<p4
+          !do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+          !   Hij%p4 = p4
+             p3 = Hij%p1
+             Hij%p3 = p3
+             call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                  spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          !enddo
+          
+
+          Hij%pcase = 27 !p1<p3<p2<p4
+          !do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+          !   Hij%p4 = p4
+             do p3 = Hij%p1 + 1, min(Hij%p2 - 1, isftp + nligv)
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          !enddo
+
+             if (Hij%p2 .le. isftp + nligv) then 
+                Hij%pcase = 29 !p1<p2=p3<p4
+             !do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+             !   Hij%p4 = p4
+                p3 = Hij%p2
+                Hij%p3 = p3
+                call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                     spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             !enddo
+             
+                Hij%pcase = 31 !p1<p2<p3<p4
+                !do p4 = Hij%p2 + 1, isftp + nligv + nvirt
+                !Hij%p4 = p4
+                do p3 = Hij%p2 + 1, min(p4 - 1, isftp + nligv)
+                   Hij%p3 = p3
+                   call hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, &
+                        spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             endif
+          enddo
+       end if
+    endif
+  end subroutine hv_blocs_2pJ
+
+  !!============================================================ 
+  !> @brief Call the correct hole function for det J
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_pJspin(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    if (dblockJ%nexcOcc .eq. 0) then
+       call hv_blocs_0hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockJ%nexcOcc .eq. 1) then
+       call hv_blocs_1hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    else if (dblockJ%nexcOcc .eq. 2) then
+       call hv_blocs_2hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+      
+    endif
+
+  end subroutine hv_blocs_pJspin
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with no holes
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_0hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    Hij%spinJ = Hij%spinpJ
+    
+    if (Hij%t1.eq.0) then
+       Hij%tcase = 1
+    else if (Hij%t2.eq.0) then
+       Hij%tcase = 4
+    else
+       Hij%tcase = 13
+    endif
+
+    call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+         fock, o_info, nelact, hcase_info, pcase_info, &
+         intkind, twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+  end subroutine hv_blocs_0hJ
+
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with no holes
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_1hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, isfth
+    !integer :: spinJ
+    !integer :: tcase
+    integer :: t3
+    integer :: shiftsaveJ
+
+    ngel   = o_info%ngel
+    nocc   = o_info%nocc
+    nligo  = o_info%nligo
+    nact   = o_info%nact
+    nligv  = o_info%nligv
+    nvirt  = o_info%nvirt
+    ntot   = o_info%ntot
+    isfth  = ngel
+
+        
+    !Case t1=0, t2=0, t3!=0, t4=0
+    if (Hij%t1.eq.0) then
+       Hij%tcase = 2
+       !up
+       Hij%spint3 = 1
+       Hij%spinJ = Hij%spinpJ + 1
+       do t3 = isfth + 1, isfth+nocc+nligo
+          Hij%t3 = t3
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+
+       !dn
+       Hij%spint3 = -1
+       Hij%spinJ = Hij%spinpJ - 1
+       do t3 = isfth + 1, isfth+nocc+nligo
+          Hij%t3 = t3
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+       enddo
+       !Case t1!=0, t2=0, t3!=0, t4=0 
+    else if (Hij%t2.eq.0) then
+       if (Hij%spint1 .eq. 1) then
+          !U0U0
+          Hij%spint3 = 1
+          Hij%spinJ = Hij%spinpJ + 1
+          
+          Hij%tcase = 5 !t3 < t1
+          do t3 = isfth + 1, Hij%t1-1
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind,&
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          
+          Hij%t3 = Hij%t1
+          Hij%tcase = 9 !t3 = t1
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+          Hij%tcase = 11 !t1 < t3
+          do t3 = Hij%t1 + 1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !U0D0
+          Hij%spint3 = -1
+          Hij%spinJ = Hij%spinpJ - 1
+          
+          Hij%tcase = 11 !t1 < t3
+          do t3 = isfth + 1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       else
+          !D0U0
+          Hij%spint3 = 1
+          Hij%spinJ = Hij%spinpJ + 1
+          
+          Hij%tcase = 5 !t3 < t1
+          do t3 = isfth + 1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !D0D0
+          Hij%spint3 = -1
+          Hij%spinJ = Hij%spinpJ - 1
+          Hij%tcase = 5 !t3 < t1
+          do t3 = isfth + 1, Hij%t1-1
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          
+          Hij%t3 = Hij%t1
+          Hij%tcase = 9 !t3 = t1
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+          Hij%tcase = 11  !t3 > t1
+          do t3 = Hij%t1 + 1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       endif
+    else
+       !Case t1!=0, t2!=0, t3!=0, t4=0
+       if (Hij%spint2 .eq. 1) then
+          if (Hij%spint1 .eq. 1) then
+             !UUU0
+             Hij%spint3 = 1
+             Hij%spinJ = Hij%spinpJ + 1
+
+
+             ! t1 in ligoU t2 in occU+ligoU
+             ! t3 in occU+ligoU
+             Hij%tcase = 14 !t3 < t2 < t1
+             do t3 = isfth + 1, Hij%t2-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo            
+             
+             Hij%tcase = 20 !t3 = t2 < t1
+             Hij%t3 = Hij%t2
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+             Hij%tcase = 24 !t2 < t3 < t1
+             do t3 = Hij%t2+1, Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             Hij%tcase = 28 !t2 < t3 = t1
+             Hij%t3 = Hij%t1
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+             Hij%tcase = 30 !t2 < t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             !UUD0
+             Hij%spint3 = -1
+             Hij%spinJ = Hij%spinpJ - 1
+             
+             Hij%tcase = 30 !t2 < t1 < t3
+             do t3 = isfth+1, isfth+nocc+nligo
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+          else
+             !DUU0
+             Hij%spint3 = 1
+             Hij%spinJ = Hij%spinpJ + 1
+             
+             !t1 in ligoD t2 in occU+ligoU
+             !t1 in occD  t2 in ligoU
+
+             Hij%tcase = 14 !t3 < t2 < t1
+             do t3 = isfth + 1, Hij%t2-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             Hij%tcase = 20 !t3 = t2 < t1
+             Hij%t3 = Hij%t2
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+             Hij%tcase = 24 !t2 < t3 < t1
+             do t3 = Hij%t2+1, isfth+nocc+nligo
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             !DUD0
+             Hij%spint3 = -1
+             Hij%spinJ = Hij%spinpJ - 1
+             
+             !t1 in ligoD t2 in occU+ligoU
+             !t1 in occD  t2 in ligoU
+
+             Hij%tcase = 24 !t2 < t3 < t1
+             do t3 = isfth+1, Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             Hij%tcase = 28 !t2 < t3 = t1
+             Hij%t3 = Hij%t1
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+             Hij%tcase = 30 !t2 < t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+          endif
+       else
+          !DDU0
+          Hij%spint3 = 1
+          Hij%spinJ = Hij%spinpJ + 1
+
+          Hij%tcase = 30 !t2 < t1 < t3
+          do t3 = isfth+1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          
+          !DDD0
+          Hij%spint3 = -1
+          Hij%spinJ = Hij%spinpJ - 1
+
+          ! t1 in ligoD t2 in occD+ligoD
+          ! t3 in occD+ligoD
+          Hij%tcase = 14 !t3 < t2 < t1
+          do t3 = isfth + 1, Hij%t2-1
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          
+          Hij%tcase = 20 !t3 = t2 < t1
+          Hij%t3 = Hij%t2
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+          Hij%tcase = 24 !t2 < t3 < t1
+          do t3 = Hij%t2+1, Hij%t1-1
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+          
+          Hij%tcase = 28 !t2 < t3 = t1
+          Hij%t3 = Hij%t1
+          call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, Hij, ldebug, Hmat)
+          
+          Hij%tcase = 30 !t2 < t1 < t3
+          do t3 = Hij%t1+1, isfth+nocc+nligo
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+                    
+       endif
+    endif
+
+  end subroutine hv_blocs_1hJ
+
+  !!============================================================ 
+  !> @brief Add the Fock part to HV for detJ with 2 holes
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_2hJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot, isfth
+    !integer :: spinJ
+    !integer :: tcase
+    integer :: t3, t4
+    integer :: shiftsaveJ
+
+    ngel   = o_info%ngel
+    nocc   = o_info%nocc
+    nligo  = o_info%nligo
+    nact   = o_info%nact
+    nligv  = o_info%nligv
+    nvirt  = o_info%nvirt
+    ntot   = o_info%ntot
+    isfth  = ngel
+
+    !Case t1=0, t2=0, t3!=0, t4!=0
+    if (Hij%t1.eq.0) then
+       !00UU
+       Hij%spint3 = 1
+       Hij%spint4 = 1
+       Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+       Hij%tcase = 3 ! t4 < t3
+       do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occU+ligoU
+          Hij%t4 = t4
+          do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo !t3 in ligoU
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       enddo
+       
+       
+       !00DU
+       Hij%spint3 = -1
+       Hij%spint4 = 1
+       Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+       Hij%tcase = 3 ! t4 < t3
+       !t3 in ligoD t4 in occU+ligoU
+       do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occU+ligoU
+          Hij%t4 = t4
+          do t3 = isfth+nocc+1, isfth+nocc+nligo !t3 in ligoD
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       enddo
+       
+       !t3 in occD  t4 in ligoU
+       do t4 = isfth + nocc + 1, isfth+nocc+nligo  !t4 in ligoU
+          Hij%t4 = t4
+          do t3 = isfth+1, isfth+nocc !t3 in occD
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       enddo
+      
+
+       !00DD
+       Hij%spint3 = -1
+       Hij%spint4 = -1
+       Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+       Hij%tcase = 3 ! t4 < t3
+       do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occD+ligoD
+          Hij%t4 = t4
+          do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo !t3 in ligoD
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+       enddo
+
+    !Case t1!=0, t2=0, t3!=0, t4!=0
+    else if (Hij%t2.eq.0) then
+       if (Hij%spint1 .eq. 1) then
+          !U0UU
+          Hij%spint3 = 1
+          Hij%spint4 = 1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+          !t1 in occU+ligoU
+          !t4 in occU+ligoU
+          !t3 in ligoU
+          
+          !*** t4 < t1
+          do t4 = isfth + 1, Hij%t1-1
+             Hij%t4 = t4
+             
+             Hij%tcase = 6 ! t4 < t3 < t1
+             do t3 = max(t4+1,isfth+nocc+1), Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !Condition on t1 in ligoU
+             if (Hij%t1 .gt. isfth+nocc) then
+                Hij%tcase = 7 ! t4 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             endif
+                
+             Hij%tcase = 8 ! t4 < t1 < t3
+             do t3 = max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          !*** t4 = t1
+          Hij%t4 = Hij%t1
+          Hij%tcase = 10 ! t4 = t1 < t3
+          do t3 = max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo 
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !*** t4 > t1
+          Hij%tcase = 12 ! t1 < t4 < t3
+          do t4 = Hij%t1+1, isfth+nocc+nligo
+             Hij%t4 = t4
+             do t3 = max(Hij%t4 + 1,isfth+nocc+1), isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+          
+
+          !U0DU
+          Hij%spint3 = -1
+          Hij%spint4 = 1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+          !t1 in occU+ligoU
+          !t3 in ligoD t4 in occU+ligoU
+          !*** t4 < t1
+          do t4 = isfth+1, Hij%t1-1
+             Hij%t4 = t4
+             Hij%tcase = 8 ! t4 < t1 < t3
+             do t3 = isfth+nocc+1, isfth+nocc+nligo
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          !*** t4 = t1
+          Hij%tcase = 10 ! t4 = t1 < t3
+          Hij%t4 = Hij%t1
+          do t3 = isfth+nocc+1, isfth+nocc+nligo 
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !*** t4 > t1
+          Hij%tcase = 12 ! t1 < t4 < t3
+          do t4 = Hij%t1+1, isfth+nocc+nligo
+             Hij%t4 = t4
+             do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+          
+          !t3 in occD  t4 in ligoU
+          !*** t4 < t1
+          if (Hij%t1 .gt. isfth + nocc) then
+             do t4 = isfth+nocc+1, Hij%t1-1
+                Hij%t4 = t4
+                Hij%tcase = 8 ! t4 < t1 < t3
+                do t3 = isfth+1, isfth+nocc
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** t4 = t1
+             Hij%tcase = 10 ! t4 = t1 < t3
+             Hij%t4 = Hij%t1
+             do t3 = isfth+1, isfth+nocc 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          endif
+
+          !*** t4 > t1
+          Hij%tcase = 12 ! t1 < t4 < t3
+          do t4 =  max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo
+             Hij%t4 = t4
+             do t3 = isfth+1, isfth+nocc
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+
+          !U0DD
+          Hij%spint3 = -1
+          Hij%spint4 = -1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+          Hij%tcase = 12 ! t1 < t4 < t3
+          do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occU+ligoU
+             Hij%t4 = t4
+             do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo !t3 in ligoU
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+       
+
+       else !spint1 = -1
+          !D0UU
+          Hij%spint3 = 1
+          Hij%spint4 = 1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+          
+          Hij%tcase = 6 ! t4 < t3 < t1
+          do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occU+ligoU
+             Hij%t4 = t4
+             do t3 = max(t4+1,isfth+nocc+1), isfth+nocc+nligo !t3 in ligoU
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+          
+          !D0DU
+          Hij%spint3 = -1
+          Hij%spint4 = 1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+          !t1 in occD + ligoD
+          !t3 in ligoD t4 in occU+ligoU
+          do t4 = isfth + 1, isfth+nocc+nligo  !t4 in occU+ligoU
+             Hij%t4 = t4
+
+             if (Hij%t1 .gt. isfth + nocc) then
+                Hij%tcase = 6 ! t4 < t3 < t1
+                do t3 =isfth+nocc+1, Hij%t1 -1 !t3 in ligoD
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+
+                Hij%tcase = 7 ! t4 < t3 = t1
+                Hij%t3 = Hij%t1
+                
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             endif
+             
+             Hij%tcase = 8 ! t4 < t1 < t3
+             do t3 = max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+          
+          !t3 in occD  t4 in ligoU
+          !t1 in occD + ligoD
+          do t4 = isfth+nocc+1, isfth+nocc+nligo  !t4 in ligoU
+             Hij%t4 = t4
+
+             Hij%tcase = 6 ! t4 < t3 < t1
+             
+             do t3 = isfth+1, min(Hij%t1 - 1, isfth+nocc) !t3 in occD
+                Hij%t3 = t3
+               
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+             
+             if (Hij%t1 .le. isfth + nocc) then
+                Hij%tcase = 7 ! t4 < t3 = t1
+                Hij%t3 = Hij%t1
+               
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+                Hij%tcase = 8 ! t4 < t1 < t3
+                do t3 = Hij%t1 + 1, isfth+nocc 
+                   Hij%t3 = t3
+               
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             endif
+          enddo
+             
+
+          !D0DD
+          Hij%spint3 = -1
+          Hij%spint4 = -1
+          Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+          !t1 in occD+ligoD
+          !t4 in occD+ligoD
+          !t3 in ligoD
+          
+          !*** t4 < t1
+          do t4 = isfth + 1, Hij%t1-1
+             Hij%t4 = t4
+             
+             Hij%tcase = 6 ! t4 < t3 < t1
+             do t3 = max(t4+1,isfth+nocc+1), Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !Condition on t1 in ligoD
+             if (Hij%t1 .gt. isfth+nocc) then
+                Hij%tcase = 7 ! t4 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             endif
+                
+             Hij%tcase = 8 ! t4 < t1 < t3
+             do t3 = max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+
+          !*** t4 = t1
+          Hij%t4 = Hij%t1
+          Hij%tcase = 10 ! t4 = t1 < t3
+          do t3 = max(Hij%t1 + 1,isfth+nocc+1), isfth+nocc+nligo 
+             Hij%t3 = t3
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+          enddo
+
+          !*** t4 > t1
+          Hij%tcase = 12 ! t1 < t4 < t3
+          do t4 = Hij%t1+1, isfth+nocc+nligo
+             Hij%t4 = t4
+             do t3 = max(Hij%t4 + 1,isfth+nocc+1), isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+          enddo
+       endif
+
+    !Case t1!=0, t2!=0, t3!=0, t4!=0
+    else
+       if (Hij%spint1 .eq. 1) then
+          if (Hij%spint2 .eq. 1) then !UU
+
+             !UUUU
+             Hij%spint3 = 1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+             !t1 in ligoU t2 in occU+ligoU t2 < t1
+             !t3 in ligoU t4 in occU+ligoU t4 < t3
+
+             !*** t4 < t2
+             do t4 = isfth+1, Hij%t2-1
+                Hij%t4 = t4
+
+                if (Hij%t2 .gt. isfth+nocc) then
+                   Hij%tcase = 15 !t4 < t3 < t2 < t1
+                   do t3 = max(t4+1,isfth+nocc+1), Hij%t2-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                
+                   Hij%tcase = 16 !t4 < t3 = t2 < t1
+                   Hij%t3 = Hij%t2
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                endif
+                
+                Hij%tcase = 17 !t4 < t2 < t3 < t1
+                do t3 = max(Hij%t2+1,isfth+nocc+1), Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 18 !t4 < t2 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                Hij%tcase = 19 !t4 < t2 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+
+             enddo
+
+             !*** t4 = t2
+             Hij%t4 = Hij%t2
+
+             Hij%tcase = 21 !t4 = t2 < t3 < t1
+             do t3 = max(Hij%t2+1,isfth+nocc+1), Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+                
+             Hij%tcase = 22 !t4 = t2 < t3 = t1
+             Hij%t3 = Hij%t1
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+             Hij%tcase = 23 !t4 = t2 < t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t2 < t4 < t1
+             do t4 = Hij%t2+1, Hij%t1-1
+                Hij%t4 = t4
+
+                Hij%tcase = 25 !t2 < t4 < t3 < t1
+                do t3 = max(Hij%t4+1,isfth+nocc+1), Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 26 !t2 < t4 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+                Hij%tcase = 27 !t2 < t4 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** t4 = t1
+             Hij%t4 = Hij%t1
+
+             Hij%tcase = 29 !t2 < t4 = t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t4 > t1
+             do t4 = Hij%t1+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                
+                Hij%tcase = 31 !t2 < t1 < t4 < t3
+                do t3 = max(Hij%t4+1, isfth+nocc+1), isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+             
+
+             !UUDU
+             Hij%spint3 = -1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+             !t1 in ligoU t2 in occU+ligoU t2 < t1
+             !t3 in ligoD t4 in occU+ligoU
+
+             !*** t4 < t2
+             Hij%tcase = 19 !t4 < t2 < t1 < t3
+             do t4 = isfth+1, Hij%t2-1
+                Hij%t4 = t4
+                do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+            
+             !*** t4 = t2
+             Hij%tcase = 23 !t4 = t2 < t1 < t3
+             Hij%t4 = Hij%t2
+             do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t2 < t4 < t1
+             Hij%tcase = 27 !t2 < t4 < t1 < t3
+             do t4 = Hij%t2+1,Hij%t1-1
+                Hij%t4 = t4
+                do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** t4 = t1
+             Hij%tcase = 29 !t2 < t4 < t1 < t3
+             Hij%t4 = Hij%t1
+             do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t4 > t1
+             Hij%tcase = 31 !t2 < t1 < t4 < t3
+             do t4 = Hij%t1+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !t1 in ligoU t2 in occU+ligoU t2 < t1
+             !t3 in occD  t4 in ligoU
+             if (Hij%t2 .gt. isfth+nocc) then
+                !*** t4 < t2
+                Hij%tcase = 19 !t4 < t2 < t1 < t3
+                do t4 = isfth+nocc+1, Hij%t2-1
+                   Hij%t4 = t4
+                   do t3 = isfth+1, isfth+nocc 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                
+                !*** t4 = t2
+                Hij%tcase = 23 !t4 = t2 < t1 < t3
+                Hij%t4 = Hij%t2
+                do t3 = isfth+1, isfth+nocc 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             endif
+
+             !*** t2 < t4 < t1
+             Hij%tcase = 27 !t2 < t4 < t1 < t3
+             do t4 = max(isfth+nocc+1,Hij%t2+1), Hij%t1-1
+                Hij%t4 = t4
+                do t3 = isfth+1, isfth+nocc 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** t4 = t1
+             Hij%tcase = 29 !t2 < t4 < t1 < t3
+             Hij%t4 = Hij%t1
+             do t3 = isfth+1, isfth+nocc 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t4 > t1
+             Hij%tcase = 31 !t2 < t1 < t4 < t3
+             do t4 =  Hij%t1+1, isfth+nocc+nligo 
+                Hij%t4 = t4
+                do t3 = isfth+1, isfth+nocc 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+             
+             
+             !UUDD
+             Hij%spint3 = -1
+             Hij%spint4 = -1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+             do t4 = isfth+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                
+                Hij%tcase = 31 !t2 < t1 < t4 < t3
+                do t3 = max(Hij%t4+1, isfth+nocc+1), isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+             
+          else !spint2 = -1 UD impossible
+             call SASS_quit('spincase impossible for t1t2',6)
+          endif
+       else !spint1 = -1
+          if (Hij%spint2 .eq. 1) then !DU
+
+             !DUUU
+             Hij%spint3 = 1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+             !t3 in ligoU t4 in occU+ligoU t4 < t3
+             !t1 in ligoD t2 in occU+ligoU
+             if ( Hij%t1 .gt. isfth+nocc) then
+             
+                !*** t4 < t2
+                Hij%tcase = 15 !t4 < t3 < t2 < t1
+                do t4 = isfth+1, Hij%t2-1
+                   Hij%t4 = t4
+                   
+                   if ( Hij%t2 .gt. isfth+nocc) then
+                      do t3 = max(Hij%t4+1,isfth+nocc+1), Hij%t2-1
+                         Hij%t3 = t3
+                         call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                              fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                              twoint, twointx, intcases, Hij, ldebug, Hmat)
+                      enddo
+                      
+                      Hij%tcase = 16 !t4 < t3 = t2 < t1
+                      Hij%t3 = Hij%t2
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   endif
+                      
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+                   do t3 = max(Hij%t2+1,isfth+nocc+1), isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                   
+                !*** t4 = t2
+                Hij%tcase = 21 !t4 = t2 < t3 < t1
+                Hij%t4 = Hij%t2
+                do t3 = max(Hij%t2+1,isfth+nocc+1), isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+
+                !*** t4 > t2
+                Hij%tcase = 25 !t2 < t4 < t3 < t1
+                do t4 = Hij%t2+1,isfth+nocc+nligo
+                   Hij%t4 = t4
+                   do t3 = max(Hij%t4+1,isfth+nocc+1), isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             else
+                !t1 in occD  t2 in ligoU
+                !t3 in ligoU t4 in occU+ligoU t4 < t3
+
+                !*** t4 < t2
+                do t4 = isfth+1, Hij%t2-1
+                   Hij%t4 = t4
+                   Hij%tcase = 15 !t4 < t3 < t2 < t1
+                   do t3 = max(Hij%t4+1,isfth+nocc+1), Hij%t2-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                   
+                   Hij%tcase = 16 !t4 < t3 = t2 < t1
+                   Hij%t3 = Hij%t2
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   
+                   
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+                   do t3 = max(Hij%t2+1,isfth+nocc+1), isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                
+                !*** t4 = t2
+                Hij%tcase = 21 !t4 = t2 < t3 < t1
+                Hij%t4 = Hij%t2
+                do t3 = max(Hij%t2+1,isfth+nocc+1), isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                
+                !*** t4 > t2
+                Hij%tcase = 25 !t2 < t4 < t3 < t1
+                do t4 = Hij%t2+1,isfth+nocc+nligo
+                   Hij%t4 = t4
+                   do t3 = max(Hij%t4+1,isfth+nocc+1), isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             endif
+             
+             !DUDU
+             Hij%spint3 = -1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+             
+             if ( Hij%t1 .gt. isfth+nocc) then
+                
+                !t1 in ligoD t2 in occU+ligoU
+                !t3 in ligoD t4 in occU+ligoU
+                !*** t4 < t2
+                do t4 = isfth+1, Hij%t2-1
+                   Hij%t4 = t4
+                   
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+                   do t3 =isfth+nocc+1, Hij%t1-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                   
+                   Hij%tcase = 18 !t4 < t2 < t3 = t1
+                   Hij%t3 = Hij%t1
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   
+                   Hij%tcase = 19 !t4 < t2 < t1 < t3
+                   do t3 = Hij%t1+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             
+                !*** t4 = t2
+                Hij%t4 = Hij%t2
+
+                Hij%tcase = 21 !t4 = t2 < t3 < t1
+                do t3 =isfth+nocc+1, Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 22 !t4 = t2 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                Hij%tcase = 23 !t4 = t2 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                !*** t4 > t2
+                
+                do t4 = Hij%t2+1, isfth+nocc+nligo
+                   Hij%t4 = t4
+                   
+                   Hij%tcase = 25 !t2 < t4 < t3 < t1
+                   do t3 =isfth+nocc+1, Hij%t1-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                   
+                   Hij%tcase = 26 !t2 < t4 < t3 = t1
+                   Hij%t3 = Hij%t1
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   
+                   Hij%tcase = 27 !t2 < t4 < t1 < t3
+                   do t3 = Hij%t1+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             
+
+                !t1 in ligoD t2 in occU+ligoU
+                !t3 in occD  t4 in ligoU
+                !*** t4 < t2
+                if (Hij%t2 .gt. isfth+nocc) then
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+                   do t4 = isfth+nocc+1, Hij%t2-1
+                      
+                      Hij%t4 = t4
+                      do t3 =isfth+1, isfth+nocc
+                         Hij%t3 = t3
+                         call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                      enddo
+                   enddo
+                
+                   !*** t4 = t2
+                   Hij%tcase = 21 !t4 = t2 < t3 < t1
+                   Hij%t4 = Hij%t2
+                   
+                   do t3 =isfth+1, isfth+nocc
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                endif
+                
+                !*** t4 > t2
+                Hij%tcase = 25 !t2 < t4 < t3 < t1
+                do t4 = max(isfth+nocc+1, Hij%t2+1), isfth+nocc+nligo
+                   Hij%t4 = t4
+                   
+                   do t3 =isfth+1, isfth+nocc
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             else
+                
+                !t1 in occD  t2 in ligoU
+                !t3 in ligoD t4 in occU+ligoU
+                !*** t4 < t2
+                do t4 = isfth+1, Hij%t2-1
+                   Hij%t4 = t4
+                   Hij%tcase = 19 !t4 < t2 < t1 < t3
+                   do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                
+                !*** t4 = t2
+                Hij%t4 = Hij%t2
+                Hij%tcase = 23 !t4 = t2 < t1 < t3
+                do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                !*** t4 > t2
+                do t4 =  Hij%t2+1, isfth+nocc+nligo
+                   Hij%t4 = t4
+                   Hij%tcase = 27 !t2 < t4 < t1 < t3
+                   do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+
+                !t1 in occD  t2 in ligoU
+                !t3 in occD  t4 in ligoU
+                !*** t4 < t2
+                do t4 = isfth+nocc+1, Hij%t2-1
+                   Hij%t4 = t4
+                   
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+                   do t3 =isfth+1, Hij%t1-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                   
+                   Hij%tcase = 18 !t4 < t2 < t3 = t1
+                   Hij%t3 = Hij%t1
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   
+                   Hij%tcase = 19 !t4 < t2 < t1 < t3
+                   do t3 = Hij%t1+1, isfth+nocc 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             
+                !*** t4 = t2
+                Hij%t4 = Hij%t2
+                Hij%tcase = 21 !t4 = t2 < t3 < t1
+                do t3 =isfth+1, Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 22 !t4 = t2 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                Hij%tcase = 23 !t4 = t2 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                !*** t4 > t2
+                do t4 = Hij%t2+1, isfth+nocc+nligo
+                   Hij%t4 = t4
+                   Hij%tcase = 25 !t2 < t4 < t3 < t1
+                   do t3 =isfth+1, Hij%t1-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                   
+                   Hij%tcase = 26 !t2 < t4 < t3 = t1
+                   Hij%t3 = Hij%t1
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   
+                   Hij%tcase = 27 !t2 < t4 < t1 < t3
+                   do t3 = Hij%t1+1, isfth+nocc 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             endif
+
+
+             !DUDD
+             Hij%spint3 = -1
+             Hij%spint4 = -1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+             
+             !t1 in ligoD t2 in occU+ligoU
+             !t3 in ligoD t4 in occD+ligoD t4 < t3
+             if ( Hij%t1 .gt.isfth+nocc) then
+                !*** t4 < t1
+                do t4 = isfth+1, Hij%t1-1
+                   Hij%t4 = t4
+                   Hij%tcase = 25 !t2 < t4 < t3 < t1
+                   do t3 = max(t4+1,isfth+nocc+1), Hij%t1-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+
+                   Hij%tcase = 26 !t2 < t4 < t3 = t1
+                   Hij%t3 = Hij%t1
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                   Hij%tcase = 27 !t2 < t4 < t1 < t3
+                   do t3 = Hij%t1+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                
+                !*** t4 = t1
+                Hij%tcase = 29 !t2 < t4 = t1 < t3
+                Hij%t4 = Hij%t1
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                !*** t4 > t1
+                do t4 = Hij%t1+1, isfth+nocc+nligo
+                   Hij%t4 = t4
+                   Hij%tcase = 31 !t2 < t1 < t4 < t3
+                   do t3 = Hij%t4+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             else
+                !t1 in occD  t2 in ligoU
+                !t3 in ligoD t4 in occD+ligoD t4 < t3
+                !*** t4 < t1
+                do t4 = isfth+1, Hij%t1-1
+                   Hij%t4 = t4
+                   Hij%tcase = 27 !t2 < t4 < t1 < t3
+                   do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+                
+                !*** t4 = t1
+                Hij%tcase = 29 !t2 < t4 = t1 < t3
+                Hij%t4 = Hij%t1
+                do t3 = isfth+nocc+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                !*** t4 > t1
+                do t4 = Hij%t1+1, isfth+nocc+nligo
+                   Hij%t4 = t4
+                   Hij%tcase = 31 !t2 < t1 < t4 < t3
+                   do t3 = max(t4+1, isfth+nocc+1), isfth+nocc+nligo
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                enddo
+             endif
+
+          else !spint2 = -1 DD
+
+             !DDUU
+             Hij%spint3 = 1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+             Hij%tcase = 15 !t4 < t3 < t2 < t1
+             do t4 = isfth+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                do t3 = max(t4+1, isfth+nocc+1), isfth+nocc+nligo
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !DDDU
+             Hij%spint3 = -1
+             Hij%spint4 = 1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+             
+             !t1 in ligoD t2 in occD+ligoD t2 < t1
+             !t3 in ligoD t4 in occU+ligoU
+             do t4 = isfth+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                if (Hij%t2 .gt. isfth+nocc) then
+                   Hij%tcase = 15 !t4 < t3 < t2 < t1
+                   do t3 = isfth+nocc+1, Hij%t2-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+
+                   Hij%tcase = 16 !t4 < t3 = t2 < t1
+                   Hij%t3 = Hij%t2
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                endif
+                
+                Hij%tcase = 17 !t4 < t2 < t3 < t1
+                do t3 = max(Hij%t2+1,isfth+nocc+1), Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+
+                Hij%tcase = 18 !t4 < t2 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                Hij%tcase = 19 !t4 < t2 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !t1 in ligoD t2 in occD+ligoD t2 < t1
+             !t3 in occD  t4 in ligoU
+              do t4 = isfth+nocc+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                Hij%tcase = 15 !t4 < t3 < t2 < t1
+                do t3 = isfth+1, min(isfth+nocc,Hij%t2-1)
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                if (Hij%t2 .le. isfth+nocc) then
+                   Hij%tcase = 16 !t4 < t3 = t2 < t1
+                   Hij%t3 = Hij%t2
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                   Hij%tcase = 17 !t4 < t2 < t3 < t1
+
+                   do t3 = Hij%t2+1,isfth+nocc
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                endif
+             enddo
+
+             !DDDD
+             Hij%spint3 = -1
+             Hij%spint4 = -1
+             Hij%spinJ = Hij%spinpJ + Hij%spint3 + Hij%spint4
+
+             !*** t4 < t2
+             do t4 = isfth+1, Hij%t2-1
+                Hij%t4 = t4
+
+                if (Hij%t2 .gt. isfth+nocc) then
+                   Hij%tcase = 15 !t4 < t3 < t2 < t1
+                   do t3 = max(t4+1,isfth+nocc+1), Hij%t2-1
+                      Hij%t3 = t3
+                      call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                   enddo
+                
+                   Hij%tcase = 16 !t4 < t3 = t2 < t1
+                   Hij%t3 = Hij%t2
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                           fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                           twoint, twointx, intcases, Hij, ldebug, Hmat)
+                endif
+                
+                Hij%tcase = 17 !t4 < t2 < t3 < t1
+                do t3 = max(Hij%t2+1,isfth+nocc+1), Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 18 !t4 < t2 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+                Hij%tcase = 19 !t4 < t2 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+
+             enddo
+
+             !*** t4 = t2
+             Hij%t4 = Hij%t2
+
+             Hij%tcase = 21 !t4 = t2 < t3 < t1
+             do t3 = max(Hij%t2+1,isfth+nocc+1), Hij%t1-1
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+                
+             Hij%tcase = 22 !t4 = t2 < t3 = t1
+             Hij%t3 = Hij%t1
+             call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                  fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                  twoint, twointx, intcases, Hij, ldebug, Hmat)
+             
+             Hij%tcase = 23 !t4 = t2 < t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t2 < t4 < t1
+             do t4 = Hij%t2+1, Hij%t1-1
+                Hij%t4 = t4
+
+                Hij%tcase = 25 !t2 < t4 < t3 < t1
+                do t3 = max(Hij%t4+1,isfth+nocc+1), Hij%t1-1
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+                
+                Hij%tcase = 26 !t2 < t4 < t3 = t1
+                Hij%t3 = Hij%t1
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+                
+                Hij%tcase = 27 !t2 < t4 < t1 < t3
+                do t3 = Hij%t1+1, isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+
+             !*** t4 = t1
+             Hij%t4 = Hij%t1
+
+             Hij%tcase = 29 !t2 < t4 = t1 < t3
+             do t3 = Hij%t1+1, isfth+nocc+nligo 
+                Hij%t3 = t3
+                call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                     fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                     twoint, twointx, intcases, Hij, ldebug, Hmat)
+             enddo
+
+             !*** t4 > t1
+             do t4 = Hij%t1+1, isfth+nocc+nligo
+                Hij%t4 = t4
+                
+                Hij%tcase = 31 !t2 < t1 < t4 < t3
+                do t3 = max(Hij%t4+1, isfth+nocc+1), isfth+nocc+nligo 
+                   Hij%t3 = t3
+                   call hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+                        fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, Hij, ldebug, Hmat)
+                enddo
+             enddo
+             
+          endif !spint2
+       endif !spint1
+    endif
+       
+
+  end subroutine hv_blocs_2hJ
+
+  
+  !!============================================================ 
+  !> @brief Add the active Fock part to HV for detJ
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_actJ(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    call fill_Hij_spinorb(Hij, o_info)
+    
+    if ((intkind%name .eq. 'fock') .or. (intkind%name .eq. 'dens')) then
+       call hv_blocs_oneint(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, Hij, ldebug, Hmat)
+    else
+       call hv_blocs_twoint(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+            fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+            twoint, twointx, intcases, Hij, ldebug, Hmat)
+    end if
+
+  end subroutine hv_blocs_actJ
+
+
+  
+end module blocs_hv
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/hv_blocs_int.F90 b/src/hv_blocs_int.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6ed7bfef4a9c91106227a38c6e1f590046b688c7
--- /dev/null
+++ b/src/hv_blocs_int.F90
@@ -0,0 +1,1137 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module blocs_hv_int
+
+  use info
+  use detact
+  use hole_part_cases
+  use spindetact
+  use typedet
+  use utils_twoint
+  use utils_intcase
+  use utils_wrt
+  use typetargetvec
+  use typebraket
+
+  implicit none
+
+contains
+  !!============================================================ 
+  !> @brief Add the one-electron operator contribution (Fock)
+  !> to HV
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine hv_blocs_oneint(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+
+    integer :: indxI, indxJ, idetactJ, isftI, isftJ, ndetactJ, i, j, m
+    integer :: p, a, t, px, py, tx, ty
+    integer :: Ndiffp, Ndiffh, imat, jmat
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J, nk
+    Integer(kindact) :: detactI, detactJ
+    integer :: nCM1, jpos
+    integer, pointer :: detCM1(:)
+    type(connectp), pointer :: detCM1orb(:)
+    integer(kindact) :: diffi, diffj, and_ij
+    integer :: sign, sign_act
+    integer :: no, nact, spinp, s, spint
+    integer, dimension(2) :: ai, aj, si, sj
+    integer, allocatable :: ak(:), sk(:)
+    real(kd_dble) :: elm
+
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    !shift for the active det of spin spinI in spinrefI
+    indxI = get_spinCatindx(spinrefI, Hij%spinI)
+    isftI = spinrefI%ShiftSpinCat(indxI)
+
+    !shift for the active det of spin spinJ in spinrefJ
+    indxJ = get_spinCatindx(spinrefJ, Hij%spinJ)
+    isftJ = spinrefJ%ShiftSpinCat(indxJ) 
+
+    Hij%spinshiftI = isftI
+    Hij%spinshiftJ = isftJ
+
+    ndetactJ = spinrefJ%NdetSpinCat(indxJ)
+
+    Ndiffp = pcase_info(Hij%pcase)%Ndiffs
+    Ndiffh = hcase_info(Hij%tcase)%Ndiffs
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+
+    ! if Ndiffp + Ndiffh = 2 then detactI = detactJ
+    if ((Ndiffp + Ndiffh .eq. 2) .and. &
+         (spinrefI%nelCAS .eq. spinrefJ%nelCAS) .and. &
+         (Hij%spinI .eq. Hij%spinJ)) then
+       select case (Ndiffp)
+       case (2)
+          !Ndiffh = 0
+          !idetactJ = idetactI
+          Ndiffact_I = 0
+          Ndiffact_J = 0
+          !if (debug) write(666,*) '2diffp 0diffh Id'
+          i = Hij%idetactI - isftI
+          j = i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          Hij%idetactJ = isftJ + j
+          Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+          select case(Hij%pcase)
+          case (3)
+             px = Hij%p3
+             py = Hij%p4 
+          case (5, 11, 18, 26)
+             px = Hij%p1
+             py = Hij%p3
+          case(13)
+             px = Hij%p1
+             py = Hij%p2
+          case(16) 
+             px = Hij%p2
+             py = Hij%p3
+          case(21,23)
+             px = Hij%p2
+             py = Hij%p4
+          case(29)
+             px = Hij%p1
+             py = Hij%p4
+          case default
+             write(*,*) 'pcase oneint', Hij%pcase
+             flush(6)
+             call SASS_quit('Ndiffp =2 pcase issue hv_blocs', f_output)
+          end select
+
+          elm = (-1)**pcase_info(Hij%pcase)%exponent * &
+               (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+               fock(px,py)
+
+          if (debug) call fill_Hmat(Hmat, Hij, elm)
+
+          do m = 1, WmJ%nvec
+             WmJ%elms(m, Hij%detshiftJ + j) = &
+                  WmJ%elms(m, Hij%detshiftJ + j) + &
+                  elm*VmI%elms(m, Hij%detshiftI + i)
+          enddo
+
+
+          !if (debug) then
+             !write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+             !     Hij%blockJshift + Hij%detshiftJ + j, elm
+             !call wrt_braket(Hij, 666, nact)
+             !write(666, *) elm
+          !endif
+
+       case (1)
+          !Ndiffh = 1
+          Ndiffact_I = 0
+          Ndiffact_J = 0
+          !if (debug) write(666,*) '1diffp 1diffh Id'
+          i = Hij%idetactI - isftI
+          j = i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          Hij%idetactJ = isftJ + j
+          Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+          select case(Hij%pcase)
+          case(2,7)
+             p = Hij%p3
+          case(4,28)
+             p = Hij%p1
+          case(10)
+             p = Hij%p4
+          case(20)
+             p = Hij%p2
+          case default
+             write(*,*) 'pcase oneint', Hij%pcase
+             call SASS_quit('Ndiffp = 1 pcase issue hv_blocs', f_output)
+          end select
+
+          select case(Hij%tcase)
+          case(2,10)
+             t = Hij%t3
+          case(4,20)
+             t = Hij%t1
+          case(7)
+             t = Hij%t4
+          case(28)
+             t = Hij%t2
+          case default
+             call SASS_quit('tcase issue hv_blocs', f_output)
+          end select
+
+          elm = (-1)**pcase_info(Hij%pcase)%exponent * &
+               calc_hole_sign(hcase_info(Hij%tcase), &
+               Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * &
+               (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+               fock(p, t)
+
+          if (debug) call fill_Hmat(Hmat, Hij, elm)
+
+          do m = 1, WmJ%nvec
+             WmJ%elms(m, Hij%detshiftJ + j) = &
+                  WmJ%elms(m, Hij%detshiftJ + j) + &
+                  elm*VmI%elms(m, Hij%detshiftI + i)
+          enddo
+
+          !if (debug) then
+          !   write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+          !Hij%blockJshift + Hij%detshiftJ + j, elm
+             !call wrt_braket(Hij, 666, nact)
+             !write(666, *) elm
+          !endif
+
+       case (0)
+          !Ndiffh = 2
+          Ndiffact_I = 0
+          Ndiffact_J = 0
+          !if (debug) write(666,*) '0diffp 2diffh Id'
+          i = Hij%idetactI - isftI
+          j = i
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          Hij%idetactJ = isftJ + j
+          Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+          select case(Hij%tcase)
+          case (3)
+             tx = Hij%t3
+             ty = Hij%t4
+          case (5, 11, 21, 23)
+             tx = Hij%t1
+             ty = Hij%t3
+          case (13)
+             tx = Hij%t1
+             ty = Hij%t2
+          case (16)
+             tx = Hij%t1
+             ty = Hij%t4
+          case (18, 26)
+             tx = Hij%t2
+             ty = Hij%t4
+          case (29)
+             tx = Hij%t2
+             ty = Hij%t3
+          case default
+             write(*,*) 'tcase oneint', Hij%tcase
+             call SASS_quit('tcase issue hv_blocs', f_output)
+          end select
+
+          elm = calc_hole_sign(hcase_info(Hij%tcase), Hij%sot1, Hij%sot2, &
+               Hij%sot3, Hij%sot4) *&
+               (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+               fock(tx,ty)
+
+          do m = 1, WmJ%nvec
+             WmJ%elms(m, Hij%detshiftJ + j) = &
+                  WmJ%elms(m, Hij%detshiftJ + j) + &
+                  elm*VmI%elms(m, Hij%detshiftI + i)
+          enddo
+
+          !if (debug) then
+             !write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+             !     Hij%blockJshift + Hij%detshiftJ + j, elm
+             !call wrt_braket(Hij, 666, nact)
+             !write(666, *) elm
+             !flush(666)
+          !endif
+
+          if (debug) call fill_Hmat(Hmat, Hij, elm)
+       case default
+          if (debug) write(666,*) ' Ndiffp + Ndiffh = 2 '
+       end select
+
+    else if (Ndiffp + Ndiffh .lt. 2) then
+       select case (Ndiffp)
+       case (1)
+          !Ndiffh = 0 F_pa
+          !if (debug) write(666,*) '1diffp 0diffh CM1'
+          Hij%detactI = spinrefI%elms(Hij%idetactI)
+          call CM1_spindetact_list(spinrefI, spinrefJ, Hij%idetactI, o_info%nact, &
+               nCM1, detCM1, detCM1orb)
+          do jpos = 1,nCM1
+             Hij%idetactJ = detCM1(jpos)
+             Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+             if ((Hij%idetactJ .ge. isftJ +1) .and. &
+                  (Hij%idetactJ .le. isftJ + ndetactJ)) then
+
+                call extract_detCMorb(detCM1orb(jpos)%p, ai, aj, si, sj, sign_act, &
+                     ndiffact_i, ndiffact_j, nk)
+
+                select case (Hij%pcase)
+                case (2, 7)
+                   p = Hij%p3
+                   spinp = Hij%spinp3
+                   a = ai(1)
+                   s = si(1)
+                case (4, 28)
+                   p = Hij%p1
+                   spinp = Hij%spinp1
+                   a = aj(1)
+                   s = sj(1)
+                case (10)
+                   p = Hij%p4
+                   spinp = Hij%spinp4
+                   a = ai(1)
+                   s = si(1)
+                case (20)
+                   p = Hij%p2
+                   spinp = Hij%spinp2
+                   a = aj(1)
+                   s = sj(1)
+                case default
+                   call SASS_quit('pcase issue F_ap', f_output)
+                end select
+
+                i = Hij%idetactI - isftI
+                j = Hij%idetactJ - isftJ
+
+                elm = sign_act * (-1)**pcase_info(Hij%pcase)%exponent * &
+                     (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+                     calc_hole_sign(hcase_info(Hij%tcase), Hij%sot1, Hij%sot2, &
+                     Hij%sot3, Hij%sot4) * fock(p, a)
+
+                do m = 1, WmJ%nvec
+                   WmJ%elms(m, Hij%detshiftJ + j) = &
+                        WmJ%elms(m, Hij%detshiftJ + j) + &
+                        elm*VmI%elms(m, Hij%detshiftI + i)
+                enddo
+
+                !if (debug) then
+                   !write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+                   !     Hij%blockJshift + Hij%detshiftJ + j, elm
+                   !call wrt_braket(Hij, 666, nact)
+                   !write(666, *) elm
+                   !flush(666)
+                !end if
+
+                if (debug) call fill_Hmat(Hmat, Hij, elm)
+             end if
+          enddo
+       case (0)
+          !Ndiffp = 0
+          select case (Ndiffh)
+          case (1)
+             !Ndiffh = 1
+             !if (debug) write(666,*) '0diffp 1diffh CM1'
+             Hij%detactI = spinrefI%elms(Hij%idetactI)
+             call CM1_spindetact_list(spinrefI, spinrefJ, Hij%idetactI, &
+                  o_info%nact, nCM1, detCM1, detCM1orb)
+             do jpos = 1,nCM1
+                Hij%idetactJ = detCM1(jpos)
+                Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+                if ((Hij%idetactJ .ge. isftJ +1) .and. &
+                     (Hij%idetactJ .le. isftJ + ndetactJ)) then
+
+                   call extract_detCMorb(detCM1orb(jpos)%p, ai, aj, si, sj, sign_act, &
+                     ndiffact_i, ndiffact_j, nk)
+                   
+                   select case (Hij%tcase)
+                   case (2, 10)
+                      t = Hij%t3
+                      spint = Hij%spint3
+                      a = aj(1)
+                      s = sj(1)
+                   case (4, 20)
+                      t = Hij%t1
+                      spint = Hij%spint1
+                      a = ai(1)
+                      s = si(1)
+                   case (7)
+                      t = Hij%t4
+                      spint = Hij%spint4
+                      a = aj(1)
+                      s = sj(1)
+                   case (28)
+                      t = Hij%t2
+                      spint = Hij%spint2
+                      a = ai(1)
+                      s = si(1)
+                   case default
+                      call SASS_quit('tcase issue F_at', f_output)
+                   end select
+
+                   i = Hij%idetactI - isftI
+                   j = Hij%idetactJ - isftJ
+       
+                   elm = sign_act * (-1)**pcase_info(Hij%pcase)%exponent * &
+                        (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+                        calc_hole_sign(hcase_info(Hij%tcase), &
+                        Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * &
+                        fock(t, a)
+
+                   do m = 1, WmJ%nvec
+                      WmJ%elms(m, Hij%detshiftJ + j) = &
+                           WmJ%elms(m, Hij%detshiftJ + j) + &
+                           elm*VmI%elms(m, Hij%detshiftI + i)
+                   enddo
+
+                   !if (debug) then
+                      !call wrt_braket(Hij, 666, nact)
+                      !write(666, *) elm
+                      !flush(666)
+                      !write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+                      !     Hij%blockJshift + Hij%detshiftJ + j, elm
+                   !endif
+
+                   if (debug) call fill_Hmat(Hmat, Hij, elm)
+                end if
+             enddo
+
+          case (0)
+             !Ndiffh = 0
+             !if (debug) write(666,*) '0diffp 0diffh CM1'
+             Hij%detactI = spinrefI%elms(Hij%idetactI)
+
+             call CM1_spindetact_list(spinrefI, spinrefJ, Hij%idetactI, &
+                  o_info%nact, nCM1, detCM1, detCM1orb)
+
+             do jpos = 1,nCM1
+                Hij%idetactJ = detCM1(jpos)
+                Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+                if ((Hij%idetactJ .ge. isftJ +1) .and. &
+                     (Hij%idetactJ .le. isftJ + ndetactJ)) then
+
+                   call extract_detCMorb(detCM1orb(jpos)%p, ai, aj, si, sj, sign_act, &
+                     ndiffact_i, ndiffact_j, nk)
+
+                   !tcase = 1,9, 22
+
+                   i = Hij%idetactI - isftI
+                   j = Hij%idetactJ - isftJ
+
+                   elm = sign_act * &
+                        (-1)**pcase_info(Hij%pcase)%exponent * &
+                        (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+                        calc_hole_sign(hcase_info(Hij%tcase), &
+                        Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * &
+                        fock(ai(1), aj(1))
+
+                   do m = 1, WmJ%nvec
+                      WmJ%elms(m, Hij%detshiftJ + j) = &
+                           WmJ%elms(m, Hij%detshiftJ + j) + &
+                           elm*VmI%elms(m, Hij%detshiftI + i)
+                   enddo
+
+                   if (debug) then
+                      call fill_Hmat(Hmat, Hij, elm)
+                      !call wrt_braket(Hij, 666, nact)
+                      !write(666, *) elm
+                      !write(666, *) Hij%blockIshift + Hij%detshiftI + i, &
+                      !     Hij%blockJshift + Hij%detshiftJ + j, elm
+                   endif
+                end if
+             enddo
+          end select
+
+       end select
+    endif
+
+    Hij%detshiftJ = Hij%detshiftJ + ndetactJ
+
+  end subroutine hv_blocs_oneint
+
+  !!============================================================ 
+  !> @brief Two-integral cases
+  !!============================================================
+  subroutine hv_blocs_twoint(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    type(braket), intent(inout)                :: Hij
+    logical                                    :: ldebug
+
+    integer :: actcase, id_case
+    integer :: indxJ, isftJ, ndetactJ
+
+    !shift for the active det of spin spinJ in spinrefJ
+    indxJ = get_spinCatindx(spinrefJ, Hij%spinJ)
+    isftJ = spinrefJ%ShiftSpinCat(indxJ) 
+    !Total nb of act. det for J
+    ndetactJ = spinrefJ%NdetSpinCat(indxJ)
+
+    do actcase = 0, 2
+       call get_intcase_id(intcases, intkind%name, DblockI%name, DblockJ%name, &
+            Hij%tcase, Hij%pcase, actcase, id_case)    
+       if (id_case .ne. 0) then
+          Hij%actcase = actcase
+          call compute_HV_intcase(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+               fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+               twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat)
+       end if
+    enddo
+
+
+    Hij%detshiftJ = Hij%detshiftJ + ndetactJ
+
+  end subroutine hv_blocs_twoint
+
+  !!============================================================ 
+  !> @brief Two-integral cases
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine compute_hv_intcase(VmI, spinrefI, dblockI, WmJ, spinrefJ, dblockJ, &
+       fock, o_info, nelact, hcase_info, pcase_info, intkind, &
+       twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat)
+
+    type(deter_dblock), pointer                :: DblockI, DblockJ
+    type(spindetact_list), pointer             :: spinrefI, spinrefJ
+    type(vecMblock), pointer                   :: VmI, WmJ
+    real(kd_dble), dimension(:,:), allocatable :: fock, Hmat
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    integer, intent(in)                        :: actcase, id_case
+    type(braket), intent(inout)                :: Hij
+    logical                                    :: ldebug
+
+    type(intcase) :: hpcase
+    integer :: indxI, indxJ, isftI, isftJ, ndetactJ
+    integer :: i, j, jpos, m
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+    type(connectp), pointer :: detCM1orb(:), detCM2orb(:)
+    integer :: Nh_I, Nh_J
+    integer :: Ndiffact_I, Ndiffact_J
+    !integer(kindact) :: detactI, detactJ
+    integer(kindact) :: diffi, diffj, and_ij
+    integer :: sign, sign_act
+    integer :: no, nact, spinp, s, spint
+    integer, dimension(2) :: ai, aj, si, sj
+    integer, allocatable :: ak(:), sk(:)
+    real(kd_dble) :: JK, elm
+
+    Nh_I = dblockI%nexcOcc
+    Nh_J = dblockJ%nexcOcc
+
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    !shift for the active det of spin spinI in spinrefI
+    indxI = get_spinCatindx(spinrefI, Hij%spinI)
+    isftI = spinrefI%ShiftSpinCat(indxI)
+    !shift for the active det of spin spinJ in spinrefJ
+    indxJ = get_spinCatindx(spinrefJ, Hij%spinJ)
+    isftJ = spinrefJ%ShiftSpinCat(indxJ) 
+    !Total nb of act. det for J
+    ndetactJ = spinrefJ%NdetSpinCat(indxJ)
+    !Det act for I
+    Hij%detactI = spinrefI%elms(Hij%idetactI)
+
+    Hij%spinshiftI = isftI
+    Hij%spinshiftJ = isftJ
+
+    hpcase = intcases%cases(id_case)%p
+
+    select case (actcase)
+    case (0) !Identity
+
+       if (Hij%spinI .eq. Hij%spinJ) then
+          i = Hij%idetactI - isftI
+          j = i
+
+          Hij%idetactJ = isftJ + j
+          Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+          call sign_diff(Hij%detactI, Hij%detactJ, diffi, diffj, and_ij, sign_act, nact)
+          call extract_orbindx_from_detact(diffi, ai, si, no, nact, Ndiffact_I)
+          call extract_orbindx_from_detact(diffj, aj, sj, no, nact, Ndiffact_J)
+
+          JK = 0.d0
+          if (hpcase%nsumact .eq. 0) then
+             call get_JK_nosum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, nelact, &
+                  hcase_info, pcase_info, intkind, twoint, twointx, intcases, &
+                  actcase, id_case, Hij, ldebug, Hmat)
+          else
+
+             allocate(ak(hpcase%nsumact))
+             allocate(sk(hpcase%nsumact))
+
+             call extract_orbindx_from_detact(and_ij, ak, sk, no, nact, hpcase%nsumact)
+             call get_JK_1sum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, nelact, &
+                  hcase_info, pcase_info, intkind, twoint, twointx, intcases, &
+                  actcase, id_case, Hij, ldebug, Hmat)
+             deallocate(ak,sk)
+
+          endif
+
+
+
+          elm = sign_act * (-1)**pcase_info(Hij%pcase)%exponent * &
+               (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+               calc_hole_sign(hcase_info(Hij%tcase), &
+               Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * JK
+
+          do m = 1, WmJ%nvec
+             WmJ%elms(m, Hij%detshiftJ + j) = &
+                  WmJ%elms(m, Hij%detshiftJ + j) + &
+                  elm*VmI%elms(m, Hij%detshiftI + i)
+          enddo
+
+          if (debug) then
+!!$             call wrt_braket(Hij, 667, nact)
+!!$             write(667, *) elm, intkind%name
+             call fill_Hmat(Hmat, Hij, elm)
+             !write(667, *) Hij%blockIshift + Hij%detshiftI + i, &
+             !     Hij%blockJshift + Hij%detshiftJ + j, elm
+          end if
+
+       endif
+    case (1) !CM1
+       call CM1_spindetact_list(spinrefI, spinrefJ, Hij%idetactI, o_info%nact, &
+            nCM1, detCM1, detCM1orb)
+
+       if (nCM1 .ne. 0) then
+
+          allocate(ak(detCM1orb(1)%p%nandIJ))
+          allocate(sk(detCM1orb(1)%p%nandIJ))
+
+          do jpos = 1,nCM1
+             Hij%idetactJ = detCM1(jpos)
+
+             if ((Hij%idetactJ .ge. isftJ +1) .and. &
+                  (Hij%idetactJ .le. isftJ + ndetactJ)) then
+                Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+                call extract_detCMorb(detCM1orb(jpos)%p, ai, aj, si, sj, sign_act, &
+                     ndiffact_i, ndiffact_j, ak, sk)
+                
+                i = Hij%idetactI - isftI
+                j = Hij%idetactJ - isftJ
+
+                JK = 0.d0
+                if (hpcase%nsumact .eq. 0) then
+                   call get_JK_nosum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, &
+                        nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat)
+                else
+                   call get_JK_1sum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, &
+                        nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat)
+                endif
+
+                elm = sign_act * (-1)**pcase_info(Hij%pcase)%exponent * &
+                     (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+                     calc_hole_sign(hcase_info(Hij%tcase), &
+                     Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * JK
+
+                do m = 1, WmJ%nvec
+                   WmJ%elms(m, Hij%detshiftJ + j) = WmJ%elms(m, Hij%detshiftJ + j) + &
+                        elm*VmI%elms(m, Hij%detshiftI + i)
+                enddo
+
+                if (debug) then
+                   !call wrt_braket(Hij, 667, nact)
+                   !write(667, *) elm, intkind%name
+                   call fill_Hmat(Hmat, Hij, elm)
+                   !write(667, *) Hij%blockIshift + Hij%detshiftI + i, &
+                   !     Hij%blockJshift + Hij%detshiftJ + j, elm          
+                end if
+
+             endif
+
+          enddo
+          deallocate(ak, sk)
+
+       endif
+
+    case (2) !CM2
+       call CM2_spindetact_list(spinrefI, spinrefJ, Hij%idetactI, o_info%nact, &
+            nCM2, detCM2, detCM2orb)
+
+       if (nCM2 .ne. 0) then
+
+          allocate(ak(detCM2orb(1)%p%nandIJ))
+          allocate(sk(detCM2orb(1)%p%nandIJ))
+
+          do jpos = 1,nCM2
+             Hij%idetactJ = detCM2(jpos)
+
+             if ((Hij%idetactJ .ge. isftJ +1) .and. &
+                  (Hij%idetactJ .le. isftJ + ndetactJ)) then
+                Hij%detactJ = spinrefJ%elms(Hij%idetactJ)
+
+                call extract_detCMorb(detCM2orb(jpos)%p, ai, aj, si, sj, sign_act, &
+                     ndiffact_i, ndiffact_j, ak, sk)
+
+                i = Hij%idetactI - isftI
+                j = Hij%idetactJ - isftJ
+
+                JK = 0.d0
+                if (hpcase%nsumact .eq. 0) then
+                   call get_JK_nosum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, &
+                        nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat) 
+                else
+                   call get_JK_1sum(JK, hpcase, ai, aj, si, sj, ak, sk, o_info, &
+                        nelact, hcase_info, pcase_info, intkind, &
+                        twoint, twointx, intcases, actcase, id_case, Hij, ldebug, Hmat)
+                endif
+
+                elm = sign_act * (-1)**pcase_info(Hij%pcase)%exponent * &
+                     (-1)**(Nh_I*Ndiffact_I + Nh_J*Ndiffact_J) * &
+                     calc_hole_sign(hcase_info(Hij%tcase), &
+                     Hij%sot1, Hij%sot2, Hij%sot3, Hij%sot4) * JK
+
+
+                do m = 1, WmJ%nvec
+                   WmJ%elms(m, Hij%detshiftJ + j) = WmJ%elms(m, Hij%detshiftJ + j) + &
+                        elm*VmI%elms(m, Hij%detshiftI + i)
+                enddo
+
+                if (debug) then
+                   !call wrt_braket(Hij, 667, nact)
+                   !write(667, *) elm, intkind%name
+                   call fill_Hmat(Hmat, Hij, elm)
+                   !write(667, *) Hij%blockIshift + Hij%detshiftI + i, &
+                   !     Hij%blockJshift + Hij%detshiftJ + j, elm
+                end if
+
+
+             endif
+          enddo
+          deallocate(ak,sk)
+
+       endif
+
+    end select
+
+
+  end subroutine compute_hv_intcase
+
+  !!============================================================ 
+  !> @brief Two-integral cases No sum over the active
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine get_JK_nosum(JK, case, ai, aj, si, sj, ak, sk, o_info, nelact, &
+       hcase_info, pcase_info, intkind, twoint, twointx, intcases, &
+       actcase, id_case, Hij, ldebug, Hmat)
+
+    real(kd_dble)                              :: JK
+    type(intcase)                              :: case
+    integer, dimension(2)                      :: ai, aj, si, sj
+    !integer(kindact)                           :: and_ij
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    integer, intent(in)                        :: actcase, id_case
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+    real(kd_dble), dimension(:,:), allocatable :: Hmat
+
+    integer, allocatable :: ak(:), sk(:)
+    integer :: k, nact
+    real(kd_dble) :: JK1, JK2
+
+    k = 0
+    nact = o_info%nact
+    JK = 0d0
+    JK1 = 0d0
+    JK2 = 0d0
+
+    select case (id_case)
+       ! case x3 = x4 = ti
+    case (71, 84, 102, 339, 340, 341, 342, 343, 344, 387, 388, 531, 532, 545, &
+         546, 559, 566)
+       case%x3 = 't1'
+       case%x4 = 't1'
+       call get_int(JK1, intkind, twoint, twointx, case, ai, aj, ak, si, sj, &
+            sk, k, Hij, ldebug, nact, Hmat)
+       case%x3 = 't2'
+       case%x4 = 't2'
+       call get_int(JK2, intkind, twoint, twointx, case, ai, aj, ak, si, sj, &
+            sk, k, Hij, ldebug, nact, Hmat)
+       case%x3 = 'ti'
+       case%x4 = 'ti'
+       JK = JK1 + JK2
+       ! case x1 = x2 = pi
+    case (289, 307, 320, 345, 346, 347, 348, 349, 350, 413, 414, 639, 640, 653, &
+         654, 667, 674)
+       case%x1 = 'p1'
+       case%x2 = 'p1'
+       call get_int(JK1, intkind, twoint, twointx, case, ai, aj, ak, si, sj, &
+            sk, k, Hij, ldebug, nact, Hmat)
+       case%x1 = 'p2'
+       case%x2 = 'p2'
+       call get_int(JK2, intkind, twoint, twointx, case, ai, aj, ak, si, sj, &
+            sk, k, Hij, ldebug, nact, Hmat)
+       case%x1 = 'pi'
+       case%x2 = 'pi'
+       JK = JK1 + JK2
+    case default
+       call get_int(JK, intkind, twoint, twointx, case, ai, aj, ak, si, sj, &
+            sk, k, Hij, ldebug, nact, Hmat)
+    end select
+  end subroutine get_JK_nosum
+
+  !!============================================================ 
+  !> @brief Two-integral cases One sum over the active
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine get_JK_1sum(JK, case, ai, aj, si, sj, ak, sk, o_info, nelact, &
+       hcase_info, pcase_info, intkind, twoint, twointx, intcases, &
+       actcase, id_case, Hij, ldebug, Hmat)
+
+    real(kd_dble)                              :: JK
+    type(intcase)                              :: case
+    integer, dimension(2)                      :: ai, aj, si, sj
+    !integer(kindact)                           :: and_ij
+    type(o_infotype), intent(in)               :: o_info
+    integer, intent(in)                        :: nelact
+    type(case_infotype)                        :: hcase_info(:), pcase_info(:)
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase_list), intent(in)             :: intcases
+    integer, intent(in)                        :: actcase, id_case
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+    real(kd_dble), dimension(:,:), allocatable :: Hmat
+
+    integer :: nact, no
+    integer :: k
+    integer, allocatable :: ak(:), sk(:)
+
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    !allocate(ak(case%nsumact))
+    !allocate(sk(case%nsumact))
+
+    !call extract_orbindx_from_detact(and_ij, ak, sk, no, nact, case%nsumact)
+
+    if (case%nsumact .ne. 0) then
+       do k = 1, case%nsumact
+
+          call get_int(JK, intkind, twoint, twointx, case, &
+               ai, aj, ak, si, sj, sk, k, Hij, ldebug, nact, Hmat)
+       enddo
+
+    endif
+        
+    !deallocate(ak)
+    !deallocate(sk)
+
+  end subroutine get_JK_1sum
+
+  !!============================================================ 
+  !> @brief Get the correct J-K and add it
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  !!============================================================
+  subroutine get_int(JK0, intkind, twoint, twointx, case, &
+       ai, aj, ak, si, sj, sk, k, Hij, ldebug, nact, Hmat)
+
+    real(kd_dble)                              :: JK0
+    type(intkind_H), intent(in)                :: intkind
+    type(intblock), intent(in)                 :: twoint, twointx
+    type(intcase)                              :: case
+    integer, dimension(2)                      :: ai, aj, si, sj
+    integer, allocatable                       :: ak(:), sk(:)
+    integer, intent(in)                        :: k, nact
+    type(braket), intent(inout)                :: Hij
+    logical, intent(in)                        :: ldebug
+    real(kd_dble), dimension(:,:), allocatable :: Hmat
+
+    integer                        :: p1, spinp1, p2, spinp2
+    integer                        :: t1, spint1, t2, spint2
+    integer                        :: p3, spinp3, p4, spinp4
+    integer                        :: t3, spint3, t4, spint4
+
+    integer :: x1, x2, x3, x4, s1, s2, s3, s4
+    integer :: x1p, x2p, x3p, x4p, s1p, s2p, s3p, s4p
+    integer, dimension(2) :: tmp
+    logical :: lzero
+    integer :: i, j
+
+    real(kd_dble) :: JK
+
+    JK = 0.d0
+
+    p1 = Hij%p1
+    spinp1 = Hij%spinp1
+    p2 = Hij%p2
+    spinp2 = Hij%spinp2
+    p3 = Hij%p3
+    spinp3=Hij%spinp3
+    p4 = Hij%p4
+    spinp4 = Hij%spinp4
+
+    t1 = Hij%t1
+    spint1 = Hij%spint1
+    t2 = Hij%t2
+    spint2 = Hij%spint2
+    t3 = Hij%t3
+    spint3 = Hij%spint3
+    t4 = Hij%t4
+    spint4 = Hij%spint4
+
+    call get_x_case(x1, s1, lzero, case%x1, ai, aj, ak, si, sj, sk, k,&
+         p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, &
+         p3, spinp3, p4, spinp4, t3, spint3, t4, spint4)
+    if (lzero) goto 100
+    call get_x_case(x2, s2, lzero, case%x2, ai, aj, ak, si, sj, sk, k,&
+         p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, &
+         p3, spinp3, p4, spinp4, t3, spint3, t4, spint4)
+    if (lzero) goto 100
+    call get_x_case(x3, s3, lzero, case%x3, ai, aj, ak, si, sj, sk, k,&
+         p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, &
+         p3, spinp3, p4, spinp4, t3, spint3, t4, spint4)
+    if (lzero) goto 100
+    call get_x_case(x4, s4, lzero, case%x4, ai, aj, ak, si, sj, sk, k,&
+         p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, &
+         p3, spinp3, p4, spinp4, t3, spint3, t4, spint4)
+    if (lzero) goto 100
+
+    if (s1.ne.s2) goto 110
+    if (s3.ne.s4) goto 110
+
+    select case (intkind%ijkl_type)
+    case(2)
+       JK = JK + ijkl2(twoint, x1, x2, x3, x4)
+    case(1)
+       JK = JK + ijkl1(twoint, x1, x2, x3, x4)
+    case (0)
+       JK = JK + ijkl0(twoint, x1, x2, x3, x4)
+    end select
+
+110 select case (case%orderexc)
+    case (1423)
+       x1p = x1
+       s1p = s1
+       x2p = x4
+       s2p = s4
+       x3p = x2
+       s3p = s2
+       x4p = x3
+       s4p = s3
+    case (1432)
+       x1p = x1
+       s1p = s1
+       x2p = x4
+       s2p = s4
+       x3p = x3
+       s3p = s3
+       x4p = x2
+       s4p = s2
+    case (1324)
+       x1p = x1
+       s1p = s1
+       x2p = x3
+       s2p = s3
+       x3p = x2
+       s3p = s2
+       x4p = x4
+       s4p = s4
+    case (1342)
+       x1p = x1
+       s1p = s1
+       x2p = x3
+       s2p = s3
+       x3p = x4
+       s3p = s4
+       x4p = x2
+       s4p = s2
+    case (2314)
+       x1p = x2
+       s1p = s2
+       x2p = x3
+       s2p = s3
+       x3p = x1
+       s3p = s1
+       x4p = x4
+       s4p = s4
+    case (3214)
+       x1p = x3
+       s1p = s3
+       x2p = x2
+       s2p = s2
+       x3p = x1
+       s3p = s1
+       x4p = x4
+       s4p = s4
+    case default
+       write (6,*) case%orderexc
+       call SASS_quit('case%orderexc not implemented in hv_blocs_int.f90',6)
+    end select
+
+    if (s1p.ne.s2p) goto 100
+    if (s3p.ne.s4p) goto 100
+
+    select case (intkind%ijkl_type)
+    case(2)
+       if (case%lintx) then
+          JK = JK - ijkl2(twointx, x1p, x2p, x3p, x4p)
+       else
+          JK = JK - ijkl2(twoint, x1p, x2p, x3p, x4p)
+       endif
+    case(1)
+       if (case%lintx) then
+          JK = JK - ijkl1(twointx, x1p, x2p, x3p, x4p)
+       else
+          JK = JK - ijkl1(twoint, x1p, x2p, x3p, x4p)
+       endif
+    case (0)
+       if (case%lintx) then
+          JK = JK - ijkl0(twointx, x1p, x2p, x3p, x4p)
+       else
+          JK = JK - ijkl0(twoint, x1p, x2p, x3p, x4p)
+       endif
+    end select
+
+100 if (case%sign .eq. -1) then
+       JK = -JK
+    endif
+
+    JK0 = JK0 + JK
+
+  end subroutine get_int
+
+
+  !!============================================================ 
+  !> @brief From intcase%xcase decide which orbital to pick
+  !> @author Elisa Rebolini
+  !> @date Nov 2018
+  subroutine get_x_case(x, s, lzero, xcase, ai, aj, ak, si, sj, sk, k, &
+       p1, spinp1, p2, spinp2, t1, spint1, t2, spint2, &
+       p3, spinp3, p4, spinp4, t3, spint3, t4, spint4) 
+
+    character(8), intent(in)                   :: xcase
+    integer, dimension(2)                      :: ai, aj, si, sj
+    integer, allocatable                       :: ak(:), sk(:)
+    integer, intent(in)                        :: k
+    integer, intent(in)                        :: p1, spinp1, p2, spinp2
+    integer, intent(in)                        :: t1, spint1, t2, spint2
+    integer, intent(in)                        :: p3, spinp3, p4, spinp4
+    integer, intent(in)                        :: t3, spint3, t4, spint4
+    integer, intent(out)                       :: x, s
+    logical, intent(out)                       :: lzero
+    
+
+    lzero = .false.
+
+    select case (xcase)
+    case ('diffI(1)')
+       x = ai(1)
+       s = si(1)
+    case('diffI(2)')
+       x = ai(2)
+       s = si(2)
+    case ('diffJ(1)')
+       x = aj(1)
+       s = sj(1)
+    case('diffJ(2)')
+       x = aj(2)
+       s = sj(2)
+    case ('andIJ(k)')
+       if (k.eq.0) then
+          lzero = .true.
+          !write(667,*) 'warning: k=0'
+          x = 0
+          s = 0
+       else
+          x = ak(k)
+          s = sk(k)
+       endif
+    case ('p1')
+       x = p1
+       s = spinp1
+    case ('p2')
+       x = p2
+       s = spinp2
+    case ('p3')
+       x = p3
+       s = spinp3
+    case ('p4')
+       x = p4
+       s = spinp4
+    case ('pi')
+       x = p1
+       s = spinp1
+       write(*,*) 'pi case ! TODO', xcase
+       call SASS_quit("case pi not implemented in hv_blocs",6)
+       
+    case ('t1')
+       x = t1
+       s = spint1
+    case ('t2')
+       x = t2
+       s = spint2
+    case ('t3')
+       x = t3
+       s = spint3
+    case ('t4')
+       x = t4
+       s = spint4
+    case ('ti')
+       x = t1
+       s = spint1
+       write(*,*) 'ti case ! TODO'
+    case default
+       write(*,*) 'xcase', xcase
+       call SASS_quit("case x1 not implemented in hv_blocs",6)
+    end select
+
+    flush(6)
+  end subroutine  get_x_case
+
+
+end module blocs_hv_int
diff --git a/src/info.F90 b/src/info.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1c707f81f0f5237c9ad4c790c066a3e64c857cc9
--- /dev/null
+++ b/src/info.F90
@@ -0,0 +1,611 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!> @brief Type definitions and initialisation for the main info structures of the program
+Module Info
+
+  use dimensions 
+  use files
+
+!!$==================================================================== 
+!!$ Definitions common informations generales : g_info
+!!$==================================================================== 
+!!$ nelact           : nbre d'électrons actifs
+!!$ nirrep           : nbre de representations irreductibles 
+!!$                    (max=IRREP_MAX)
+!!$ na               : nbre d'électrons actifs up
+!!$ nb               : nbre d'électrons actifs down
+!!$==================================================================== 
+!!$ Definitions common informations generales : prog_info
+!!$====================================================================
+!!$ Yprefix          : =.true. prefixe de nom de fichiers defini
+!!$ prefix           : prefixe de nom de fichiers
+!!$ molcas           : version de molcas
+!!$ prt_cipci        : Print option for cipci
+!!$==================================================================== 
+!!$ Definitions common informations sur les orbitales : o_info
+!!$==================================================================== 
+!!$ norb_gel(irrep)  : nbre d'orbitales gelees par irrep
+!!$ norb_occ(irrep)  : nbre d'orbitales occuppees par irrep
+!!$ norb_ligo(irrep) : nbre d'orbitales ligand occuppees par irrep
+!!$ norb_act(irrep)  : nbre d'orbitales actives par irrep
+!!$ norb_ligv(irrep) : nbre d'orbitales ligand virtuelles par irrep
+!!$ norb_virt(irrep) : nbre d'orbitales virtuelles par irrep
+!!$ norb_del(irrep)  : nbre d'orbitales deletes par irrep
+!!$ norb (irrep,i)   : nbre total d'orbitales par irrep sauf gel et del
+!!$                    i= 0=gel  1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$ ngel             : nbre total d'orbitales gelees 
+!!$ nocc             : nbre total d'orbitales occuppees 
+!!$ nligo            : nbre total d'orbitales ligand occuppees 
+!!$ nact             : nbre total d'orbitales actives (max=NACT_MAX)
+!!$ nligv            : nbre total d'orbitales ligand virtuelles 
+!!$ nvirt            : nbre total d'orbitales virtuelles 
+!!$ ndel             : nbre total d'orbitales deletes 
+!!$ ntot             : nbre total d'orbitales occ+ligo+act+ligv+virt
+!!$==================================================================== 
+!!$ Definitions common ordres sur les orbitales : ord_info
+!!$==================================================================== 
+!!$ ord(iorb,irrep)  : numero d'ordre de l'orbitale ds sass 
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ orda(iorb,irrep) : numero d'ordre de la spin-orbitale alpha ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordb(iorb,irrep) : numero d'ordre de la spin-orbitale beta ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordinva(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    alpha (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$ ordinvb(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    beta (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del 
+!!$==================================================================== 
+!!$ Definitions common informations vecteurs recherches : v_info
+!!$==================================================================== 
+!!$ stot      : =2S+1 avec S spin total des etats recherches
+!!$ sz        : =2Sz des etats recherches
+!!$ vec_irrep : representation irreductible des etats recherches
+!!$ nvec      : nbre d'etats recherches
+!!$ ncfspref0 : nbre de conf de spin S construites à partir des ref0
+!!$ 
+!!$==================================================================== 
+!!$ Definitions common informations determinants : det_info
+!!$====================================================================
+!!$ nameref0  : si ref0 pas donné par une liste de det nom de l'espace ref0
+!!$ nref0     : nombre de references 0 (defaut=1, max : NREF0_MAX)
+!!$ nref1     : nombre de references 1 (defaut=0)
+!!$ ndetM     : nombre de monos (defaut = 0)
+!!$ ndet      : nombre total de det (defaut=1)
+!!$ ndet1     : nbre de det dans P1 H P1
+!!$ ndetcaslm : nombre de déterminants dans le CAS + 
+!!$             ligands occ (l) et ligand virt. (m) 
+!!$==================================================================== 
+!!$ Definitions common informations les intégrales : int_info
+!!$==================================================================== 
+
+!!$==================================================================== 
+!!$ Definitions common informations symetrie : sym_info
+!!$==================================================================== 
+!!$ its       : table de multiplication générique des groupes D2h
+!!$ iChTb     : table de caracteres du groupe ponctuel
+!!$ iIrTb     : table de multiplication des irreps
+!!$
+!!$==================================================================== 
+!!$ Definitions common énergie : ener_info
+!!$====================================================================
+!!$ potnuc    : potentiel nucléaire
+!!$ Ecoeur    : énergie du det occ + locc
+!!$ Ener(:)   : énergies des vecteurs pp recherchés
+!!$
+!!$==================================================================== 
+!!$ Definitions common procedure de Davidson : david_info
+!!$====================================================================
+!!$ Sizeheff  : Size of Heff in Davidson procedure
+!!$ NitDavid  : Number of Davidson superiterations
+!!$ tol_orth, tol_norm, tol_conv : Orthogonality and normalisation thresholds
+!!$ iter0     : # of the zeroth itermation (for restart)
+!!$ conv_ener : to enable convergence on energies
+!!$
+!!$ -------- Autres variables ----------------------------------------
+!!$ orb_info(i,iorb) : i=1 : irrep de iorb
+!!$                  : i=2 : type de iorb (avec 0 pour gel et 6 pour del) 
+!!$ det(i)           : tableau des déterminants, structure de type deter
+  implicit none
+
+  type, public :: g_infotype
+     !> @brief Number of active electrons
+     Integer (KIND=kd_int), public :: nelact
+     !> @brief Number of irreducible representations
+     Integer (KIND=kd_int), public :: nirrep
+     !> @brief Number of spin-up active electrons
+     Integer (KIND=kd_int), public :: na
+     !> @brief Number of spin-down active electrons
+     Integer (KIND=kd_int), public :: nb
+  end type g_infotype
+
+  type, public :: prog_infotype
+     !> @brief Starting CPU time
+     real(kd_dble) :: tstart
+     !> @brief Starting Wall time
+     real(kd_dble) :: wstart
+     !> @brief True if file prefix defined
+     Logical :: Yprefix
+     !> @brief Files' prefix
+     Character*40 :: prefix
+     !> @brief Print level
+     Integer :: iprint
+     !> @brief Print option for determinants
+     Logical :: print_det
+     !> @brief Print option for cipci
+     Logical :: prt_cipci
+     !> @brief Method
+     Character*8 :: method
+     !> @brief MethodAct CAS or SAS
+     Character*3 :: methodAct
+     !> @brief MethodExc (DDCI, S, SD)
+     Character*4 :: methodExc
+     !> @brief Restart calculation from prefix.restart file
+     Logical :: restart
+     !> @brief Number of CPUs
+     Integer :: nb_cpu
+     !> @brief Rank of CPU
+     Integer :: id_cpu
+     !> @brief Nb of OMP threads
+     Integer :: nb_thread
+     !> @brief Read Hmat.mat to compare it with the explicit one
+     Logical :: lreadHmat
+     !> @brief Print Hmat to file (1=bmat, 2=MAT, 3=mat2)
+     integer :: iprintHmat
+     !> @brief Explicit Hij
+     Logical :: lexplicit
+     !> @brief Diagonalisation routine (=1 dsyevd, =2 given, =3 jacobi_jacscf)
+     Integer :: idiag
+     !> @brief Sizebatch
+     Integer :: sizebatch
+     !> @brief option to deactivate MPI load balancing
+     Logical :: mpi_load_balance
+     !> @brief Debug option to turn off blocks of determinants
+     Logical, dimension(9) :: nodet_block
+  end type prog_infotype
+
+  type, public :: o_infotype
+     !> @brief Number of frozen orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_gel
+     !> @brief Number of occupied orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_occ
+     !> @brief Number of occupied ligand orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_ligo
+     !> @brief Number of active orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_act
+     !> @brief Number of virtual ligand orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_ligv
+     !> @brief Number of virtual orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_virt
+     !> @brief Number of deleted orbitals per irrep
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX) :: norb_del
+     !> @brief Total number of orbitals per irrep (except frozen and deleted)
+     !> i= 0=gel  1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX,0:6) :: norb
+
+     !> @brief Total number of frozen orbitals
+     Integer (KIND=kd_int), public :: ngel
+     !> @brief Total number of occupied orbitals
+     Integer (KIND=kd_int), public :: nocc
+     !> @brief Total number of occupied ligand orbitals
+     Integer (KIND=kd_int), public :: nligo
+     !> @brief Total number of active orbitals
+     Integer (KIND=kd_int), public :: nact
+     !> @brief Total number of virtual ligand orbitals
+     Integer (KIND=kd_int), public :: nligv
+     !> @brief Total number of virtual orbitals
+     Integer (KIND=kd_int), public :: nvirt
+     !> @brief Total number of deleted orbitals
+     Integer (KIND=kd_int), public :: ndel
+     !> @brief Total number of orbitals
+     Integer (KIND=kd_int), public :: ntot
+  end type o_infotype
+
+  type, public :: ord_infotype
+     !> @brief ord(iorb,irrep) SASS orbital number for the iorb MOLCAS orbital
+     !> of the irrep irreducible representation
+     Integer (KIND=kd_int), dimension(:,:), allocatable :: ord
+     !> @brief orda(iorb,irrep) SASS spin-orbital number for the iorb MOLCAS
+     !> alpha spin-orbital of the irrep irreducible representation
+     Integer (KIND=kd_int), dimension(:,:), allocatable :: orda
+     !> @brief ordb(iorb,irrep) SASS spin-orbital number for the iorb MOLCAS
+     !> beta spin-orbital of the irrep irreducible representation
+     Integer (KIND=kd_int), dimension(:,:), allocatable :: ordb
+     !> @brief ordinva(iorb,i) MOLCAS spin-orbital number for the iorb SASS
+     !> alpha spin-orbital of type i
+     !> i= 0=gel  1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+     Integer (KIND=kd_int), dimension(:,:), allocatable :: ordinva
+     !> @brief ordinvb(iorb,i) MOLCAS spin-orbital number for the iorb SASS
+     !> beta spin-orbital of type i
+     !> i= 0=gel  1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+     Integer (KIND=kd_int), dimension(:,:), allocatable :: ordinvb
+  end type ord_infotype
+
+  type, public :: v_infotype
+     !> @brief =2S+1 with S the total spin of the target states
+     Integer (KIND=kd_int), public :: stot
+     !> @brief =2Sz of the target states
+     Integer (KIND=kd_int), public :: sz
+     !> @brief irrep of the target states
+     Integer (KIND=kd_int), public :: vec_irrep
+     !> @brief Number of target states
+     Integer (KIND=kd_int), public :: nvec
+     !> @brief Number of spin configurations built from ref0
+     Integer (KIND=kd_int), public :: ncfspref0
+  end type v_infotype
+
+  type, public :: det_infotype
+     !> @brief Number of ref0 determinants
+     !> (defaut=1, max : NREF0_MAX)
+     Integer (KIND=kd_int), public :: nref0
+     !> @brief Number of ref1 determinants
+     !> (default=1)
+     Integer (KIND=kd_int), public :: nref1
+     Integer (KIND=kd_int), public :: nref1cascas
+     Integer (KIND=kd_int), public :: nref1ligocas
+     Integer (KIND=kd_int), public :: nRef1CASLigv
+     Integer (KIND=kd_int), public :: NRef1ligoligv
+
+     ! Infos sur la créaction des Monos  par blocs
+     !> @brief Total number of screening determinants
+     Integer (KIND=kd_int) :: ndetM
+
+     Integer (KIND=kd_int) :: &
+          nMCasCasRef1CasCas,   & ! gener_0000
+          nMCasVirtRef0, nMCasVirtRef1CasCas,      & ! gener_0001
+          nMCasLigvRef1CasCas,   & ! gener_0010
+          nMCasVirtRef1CasLigv,  & ! gener_0011
+          nMCasLigvRef1CasLigv,  & ! gener_0020
+          nMLigoCasRef1CasCas,   & ! gener_0100
+          nMLigoVirtRef0, nMLigoVirtRef1CasCas,  nMCasVirtRef1LigoCas, & ! gener_0101
+          nMLigoLigvRef1CasCas,  & ! gener_0110
+          nMLigoVirtRef1CasLigv, nMCasVirtRef1LigoLigv, & ! gener_0111
+          nMLigoLigvRef1CasLigv, & ! gener_0120
+          nMLigoCasRef1LigoCas,  & ! gener_0200
+          nMLigoVirtRef1LigoCas, & ! gener_0201
+          nMLigoLigvRef1LigoCas, & ! gener_0210
+          nMLigoVirtRef1LigoLigv,& ! gener_0211
+          nMLigoLigvRef1LigoLigv,& ! gener_0220
+          nMOccCasRef0, nMOccCasRef1CasCas,       & ! gener_1000
+          nMOccVirtRef0, nMOccVirtRef1CasCas,     & ! gener_1001
+          nMOccLigvRef0, nMOccLigvRef1CasCas, nMOccCasRef1CasLigv,    & ! gener_1010
+          nMOccVirtRef1CasLigv,  & ! gener_1011
+          nMOccLigvRef1CasLigv,  & ! gener_1020
+          nMOccCasRef1LigoCas,   & ! gener_1100
+          nMOccVirtRef1LigoCas,  & ! gener_1101
+          nMOccLigvRef1LigoCas, nMOccCasRef1LigoLigv, & ! gener_1110
+          nMOccVirtRef1LigoLigv, & ! gener_1111
+          nMOccLigvRef1LigoLigv    ! gener_1120   
+
+     !> @brief Number of determinants in P1 H P1
+     Integer (KIND=kd_int), public :: ndet1
+     !> @brief Number of determinants in CAS + ligo + ligv
+     Integer (KIND=kd_int), public :: ndetcaslm
+     !> @brief Total number of determinants (default=3)
+     Integer (KIND=kd_int), public :: ndet
+
+     Integer (KIND=kd_int), public :: nmonoref0
+
+     Integer (KIND=kd_int), public :: ndiref0
+  end type det_infotype
+
+  type, public :: ener_infotype
+     !> @brief E_nn
+     real*8, public ::potnuc
+     !> @brief Energy of the determinant occ+ligo
+     Real (KIND=kd_dble), public :: Ecoeur
+     Real (KIND=kd_dble), dimension(:), allocatable, public :: Ener
+  end type ener_infotype
+
+  type, public :: int_infotype
+     integer :: n_1int
+     integer :: n_oooo
+     integer :: n_aaaa
+     integer :: n_aaao
+     integer :: n_aaoo
+     integer :: n_aoao
+     integer :: n_aooo
+     integer :: n_vooo
+     integer :: n_vaoo
+     integer :: n_voao
+     integer :: n_vaao
+     integer :: n_voaa
+     integer :: n_vaaa
+     integer :: n_vvoo
+     integer :: n_vovo
+     integer :: n_vvao
+     integer :: n_vavo
+     integer :: n_vvaa
+     integer :: n_vava
+     integer :: n_vvvo
+     integer :: n_vvva
+     integer :: n_vvvv
+     integer :: n_gint !2e- int with at least one frozen orbital
+     integer :: n_2int
+     integer :: nintkind
+     integer :: CASS_nintkind = 21
+     character(4), dimension(:), allocatable :: CASS_intkind     
+  end type int_infotype
+
+  type, public :: david_infotype
+     !> @brief Size of Heff in Davidson procedure
+     Integer (KIND=kd_int), public :: Sizeheff
+     !> @brief Number of Davidson superiterations 
+     Integer (KIND=kd_int), public :: NitDavid
+     !> @brief Orthogonality and normalisation thresholds
+     real(kd_dble), public :: tol_orth, tol_norm, tol_conv
+     !> @brief  # of the zeroth itermation (for restart)
+     Integer (KIND=kd_int), public :: iter0
+     !> @brief To enable convergence in energy
+     Logical, public :: conv_ener
+     !> @brief Logical to turn on debug options in Davidson procedure
+     Logical, public :: debug_dav
+  end type david_infotype
+
+
+  type, public :: sym_infotype 
+     !> @brief Character Table for Symmetry group
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX, IRREP_MAX) :: iChTb
+     !> @brief Irrep Multiplication Table 
+     Integer (KIND=kd_int), public, dimension(IRREP_MAX, IRREP_MAX) :: iIrTb
+  end type sym_infotype
+
+  !> @brief Generic multiplication table for D2h groups
+  Integer its(IRREP_MAX,IRREP_MAX) 
+  data its &
+       /1,2,3,4,5,6,7,8, &
+       2,1,4,3,6,5,8,7, &
+       3,4,1,2,7,8,5,6, &
+       4,3,2,1,8,7,6,5, &
+       5,6,7,8,1,2,3,4, &
+       6,5,8,7,2,1,4,3, &
+       7,8,5,6,3,4,1,2, &
+       8,7,6,5,4,3,2,1/
+
+  !> @brief orb_info(i,iorb)
+  !> i=1 : iorb's irrep
+  !> i=2 : iorb's type (0 for frozen and 6 for del) 
+  Integer (KIND=kd_int), dimension(:,:), allocatable :: orb_info
+
+  integer, public :: nintblock = 299
+
+  !> Contains information on the sign and number of differences between two
+  !! types of determinant
+  type :: case_infotype
+     integer :: ndiffs
+
+     ! sign is a 5 bit integer indicating whether each of the following
+     ! parameters should be included in the exponent of the sign
+     ! Bit 0: -1
+     ! Bit 1: 1i
+     ! Bit 2: 2i
+     ! Bit 3: 1j
+     ! Bit 4: 2j
+     ! e.g. exponent = 10101 corresponds to a sign of (-1) ** (2j + 2i + 1)
+     integer :: exponent
+  end type case_infotype
+
+contains
+
+  !> @brief Initialisation of all variables
+  subroutine init(g_info, prog_info, o_info, v_info, &
+       det_info, ener_info, int_info, bdav_info, sym_info)
+
+    implicit none
+
+    type(g_infotype), intent(inout)    :: g_info
+    type(prog_infotype), intent(out)   :: prog_info
+    type(o_infotype), intent(inout)    :: o_info
+    type(v_infotype), intent(inout)    :: v_info
+    type(det_infotype), intent(inout)  :: det_info
+    type(ener_infotype), intent(inout) :: ener_info
+    type(int_infotype), intent(inout)  :: int_info
+    type(david_infotype), intent(inout):: bdav_info
+    type(sym_infotype), intent(inout)  :: sym_info
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Initialisations 
+!!$-----
+    ! g_info
+    g_info%nelact = 0
+    g_info%nirrep = 1
+    g_info%na = 0
+    g_info%nb = 0
+
+    !prog_info
+    call init_prog(prog_info)
+
+    ! o_info
+    o_info%norb_gel(:)  = 0
+    o_info%norb_occ(:)  = 0
+    o_info%norb_ligo(:) = 0 
+    o_info%norb_act(:)  = 0
+    o_info%norb_ligv(:) = 0
+    o_info%norb_virt(:) = 0
+    o_info%norb_del(:)  = 0
+    o_info%norb(:,:) = 0
+    o_info%ngel = 0 
+    o_info%nocc = 0 
+    o_info%nligo= 0 
+    o_info%nact = 0 
+    o_info%nligv= 0 
+    o_info%nvirt= 0 
+    o_info%ndel = 0 
+    o_info%ntot = 0
+
+    !ord_info
+
+    ! v_info
+    v_info%stot = 1
+    v_info%sz   = 0
+    v_info%vec_irrep = 1
+    v_info%nvec = 1
+    v_info%ncfspref0 = 0 !> @todo check if 0 or 1
+
+    ! det_info
+    det_info%nref0 = 1  
+    det_info%nref1 = 0
+    det_info%ndetM = 0
+    det_info%ndetcaslm = 0
+    det_info%ndet  = 1
+    det_info%ndet1  = 0
+    det_info%nmonoref0 = 0 
+    det_info%ndiref0   = 0
+
+    !sym_info
+    sym_info%iChTb(:,:) = 0
+    sym_info%iIrTb(:,:) = 0
+
+    ! int_info
+    int_info%n_1int = 0
+    int_info%n_oooo = 0
+    int_info%n_aaaa = 0
+    int_info%n_aaao = 0
+    int_info%n_aaoo = 0
+    int_info%n_aoao = 0
+    int_info%n_aooo = 0
+    int_info%n_vooo = 0
+    int_info%n_vaoo = 0
+    int_info%n_voao = 0
+    int_info%n_vaao = 0
+    int_info%n_voaa = 0
+    int_info%n_vaaa = 0
+    int_info%n_vvoo = 0
+    int_info%n_vovo = 0
+    int_info%n_vvao = 0
+    int_info%n_vavo = 0
+    int_info%n_vvaa = 0
+    int_info%n_vava = 0
+    int_info%n_vvvo = 0
+    int_info%n_vvva = 0
+    int_info%n_vvvv = 0
+    int_info%n_gint = 0
+    int_info%n_2int = 0
+    int_info%nintkind = 0
+    int_info%CASS_nintkind = 21
+    allocate(int_info%CASS_intkind(int_info%CASS_nintkind))
+    int_info%CASS_intkind(:) &
+         = (/ 'fock', 'aaaa', 'aaao', 'vaaa', 'aaoo', 'vaao', 'vvaa','vaoo', &
+         'vvao','vvoo', 'vava','vvvo','vvva','vvvv','oooo','vovo','aooo','vavo',&
+         'vooo','aoao','voao'/)
+
+
+
+    ! ener_info
+    ener_info%potnuc = 0.d0
+    ener_info%Ecoeur = 0.d0
+
+    !  bdav_info
+    bdav_info%Sizeheff = 10
+    bdav_info%NitDavid = 100
+    bdav_info%tol_orth = 1.d-15
+    bdav_info%tol_norm = 1.d-12
+
+  End Subroutine init
+
+
+  subroutine init_prog(prog_info)
+
+    type(prog_infotype), intent(inout) :: prog_info 
+
+    ! prog_info
+    prog_info%Yprefix =.false.
+    prog_info%iprint = 0
+    prog_info%print_det = .false.
+    prog_info%prt_cipci = .false.
+    prog_info%methodAct = 'SAS'
+    prog_info%methodExc = 'S'
+    prog_info%method = 'SAS+S'
+    prog_info%prefix = '                                        '
+    prog_info%restart = .false.
+    prog_info%nb_cpu = 1
+    prog_info%id_cpu = 0
+    prog_info%nb_thread = 1
+    prog_info%lexplicit = .false.
+    prog_info%lreadHmat = .false.
+    prog_info%idiag = 1
+
+  end subroutine init_prog
+
+  subroutine info_free(g_info, prog_info, o_info, ord_info, v_info, &
+       det_info, ener_info, int_info, bdav_info, sym_info)
+
+    type(g_infotype), intent(inout)     :: g_info
+    type(prog_infotype), intent(inout)  :: prog_info
+    type(o_infotype), intent(inout)     :: o_info
+    type(ord_infotype), intent(inout)   :: ord_info
+    type(v_infotype), intent(inout)     :: v_info
+    type(det_infotype), intent(inout)   :: det_info
+    type(ener_infotype), intent(inout)  :: ener_info
+    type(int_infotype), intent(inout)   :: int_info
+    type(david_infotype), intent(inout) :: bdav_info
+    type(sym_infotype), intent(inout)   :: sym_info
+
+    call ord_info_free(ord_info)
+
+    if (allocated(ener_info%Ener)) then
+       deallocate(ener_info%Ener)
+    endif
+
+    if (allocated(int_info%cass_intkind)) then
+       deallocate(int_info%cass_intkind)
+    endif
+
+  end subroutine info_free
+  
+
+  
+  subroutine ord_info_free(ord_info)
+
+    type(ord_infotype), intent(inout)  :: ord_info
+
+    if (allocated(ord_info%ord)) then
+       deallocate(ord_info%ord)
+    endif
+
+    if (allocated(ord_info%orda)) then
+       deallocate(ord_info%orda)
+    endif
+
+    if (allocated(ord_info%ordb)) then
+       deallocate(ord_info%ordb)
+    endif
+
+
+  end subroutine ord_info_free
+
+End Module Info
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/info_prop.F90 b/src/info_prop.F90
new file mode 100644
index 0000000000000000000000000000000000000000..b3fe66170168f5522bbd65f5f4355c9660dc0871
--- /dev/null
+++ b/src/info_prop.F90
@@ -0,0 +1,41 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+Module Info_prop
+  use dimensions
+  implicit none
+  
+  type, public :: prop_infotype
+     !> @brief Number of properties
+     Integer(KIND=kd_int) :: nprop
+     character*5, dimension(nprop_max) :: whichprop 
+  end type prop_infotype
+
+end Module Info_prop
diff --git a/src/init.F90 b/src/init.F90
new file mode 100644
index 0000000000000000000000000000000000000000..929afdc3afd56e65bc46316e5fcd8d333d33ae31
--- /dev/null
+++ b/src/init.F90
@@ -0,0 +1,150 @@
+
+subroutine init(g_info, prog_info, o_info, v_info, &
+     det_info, ener_info, int_info, bdav_info, sym_info)
+!!$ Initialisation des variables 
+!!$ -------- Donness globales ---------------------------------
+  use info
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+
+  type(g_infotype), intent(inout)    :: g_info
+  type(prog_infotype), intent(out)   :: prog_info
+  type(o_infotype), intent(inout)    :: o_info
+  !type(ord_infotype), intent(inout)  :: ord_info
+  type(v_infotype), intent(inout)    :: v_info
+  type(det_infotype), intent(inout)  :: det_info
+  type(ener_infotype), intent(inout) :: ener_info
+  type(int_infotype), intent(inout)  :: int_info
+  type(david_infotype), intent(inout):: bdav_info
+  type(sym_infotype), intent(inout)  :: sym_info
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Initialisations 
+!!$-----
+  ! g_info
+  g_info%nelact = 0
+  g_info%nirrep = 1
+  g_info%na = 0
+  g_info%nb = 0
+
+  !prog_info
+  call init_prog(prog_info)
+
+  ! o_info
+  o_info%norb_gel(:)  = 0
+  o_info%norb_occ(:)  = 0
+  o_info%norb_ligo(:) = 0 
+  o_info%norb_act(:)  = 0
+  o_info%norb_ligv(:) = 0
+  o_info%norb_virt(:) = 0
+  o_info%norb_del(:)  = 0
+  o_info%norb(:,:) = 0
+  o_info%ngel = 0 
+  o_info%nocc = 0 
+  o_info%nligo= 0 
+  o_info%nact = 0 
+  o_info%nligv= 0 
+  o_info%nvirt= 0 
+  o_info%ndel = 0 
+  o_info%ntot = 0
+
+  !ord_info
+
+  ! v_info
+  v_info%stot = 1
+  v_info%sz   = 0
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 !> @todo check if 0 or 1
+
+  ! det_info
+  det_info%nref0 = 1  
+  det_info%nref1 = 0
+  det_info%ndetM = 0
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+
+  !sym_info
+  sym_info%iChTb(:,:) = 0
+  sym_info%iIrTb(:,:) = 0
+
+  ! int_info
+  int_info%n_1int = 0
+  int_info%n_oooo = 0
+  int_info%n_aaaa = 0
+  int_info%n_aaao = 0
+  !int_info%n_aoaa = 0
+  int_info%n_aaoo = 0
+  int_info%n_aoao = 0
+  int_info%n_aooo = 0
+  int_info%n_vooo = 0
+  int_info%n_vaoo = 0
+  int_info%n_voao = 0
+  int_info%n_vaao = 0
+  int_info%n_voaa = 0
+  int_info%n_vaaa = 0
+  int_info%n_vvoo = 0
+  int_info%n_vovo = 0
+  int_info%n_vvao = 0
+  int_info%n_vavo = 0
+  !int_info%n_vova = 0
+  int_info%n_vvaa = 0
+  int_info%n_vava = 0
+  int_info%n_vvvo = 0
+  int_info%n_vvva = 0
+  int_info%n_vvvv = 0
+  int_info%n_gint = 0
+  int_info%n_2int = 0
+  int_info%nintkind = 0
+  int_info%CASS_nintkind = 21
+  allocate(int_info%CASS_intkind(int_info%CASS_nintkind))
+  int_info%CASS_intkind(:) &
+       = (/ 'fock', 'aaaa', 'aaao', 'vaaa', 'aaoo', 'vaao', 'vvaa','vaoo', &
+       'vvao','vvoo', 'vava','vvvo','vvva','vvvv','oooo','vovo','aooo','vavo',&
+       'vooo','aoao','voao'/)
+
+
+
+  ! ener_info
+  ener_info%potnuc = 0.d0
+  ener_info%Ecoeur = 0.d0
+
+  !  bdav_info
+  bdav_info%Sizeheff = 10
+  bdav_info%NitDavid = 100
+  bdav_info%tol_orth = 1.d-15
+  bdav_info%tol_norm = 1.d-12
+
+End Subroutine init
+
+
+subroutine init_prog(prog_info)
+
+  use info
+
+  implicit none
+
+  type(prog_infotype), intent(inout) :: prog_info 
+
+  ! prog_info
+  prog_info%Yprefix =.false.
+  prog_info%iprint = 0
+  prog_info%print_det = .false.
+  prog_info%prt_cipci = .false.
+  prog_info%methodAct = 'SAS'
+  prog_info%methodExc = 'S'
+  prog_info%method = 'SAS+S'
+  prog_info%prefix = '                                        '
+  prog_info%restart = .false.
+  prog_info%nb_cpu = 1
+  prog_info%id_cpu = 0
+  prog_info%nb_thread = 1
+  prog_info%lexplicit = .false.
+  prog_info%lreadHmat = .false.
+  prog_info%idiag = 1
+
+end subroutine init_prog
diff --git a/src/init_prop.F90 b/src/init_prop.F90
new file mode 100644
index 0000000000000000000000000000000000000000..bafe3068e275fbc529890b706bb52225215ae96e
--- /dev/null
+++ b/src/init_prop.F90
@@ -0,0 +1,109 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+subroutine init_prop(g_info, prog_info, o_info, v_info, det_info, sym_info, prop_info)
+!!$ Initialisation des variables 
+!!$ -------- Donness globales ---------------------------------
+  use dimensions
+  use info
+  use info_prop
+  use typedet
+  !         use deter
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+
+  type(g_infotype),       intent(inout) :: g_info
+  type(prog_infotype),    intent(out)   :: prog_info
+  type(o_infotype),       intent(inout) :: o_info
+  type(v_infotype),       intent(inout) :: v_info
+  type(det_infotype),     intent(inout) :: det_info
+  type(sym_infotype),     intent(inout) :: sym_info
+  type(prop_infotype),    intent(inout) :: prop_info
+  
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Initialisations 
+!!$-----
+        ! g_info
+        g_info%nelact = 0
+        g_info%nirrep = 1
+        g_info%na = 0
+        g_info%nb = 0
+                
+        !prog_info
+        call init_prog(prog_info)
+
+        ! o_info
+        o_info%norb_gel(:)  = 0
+        o_info%norb_occ(:)  = 0
+        o_info%norb_ligo(:) = 0 
+        o_info%norb_act(:)  = 0
+        o_info%norb_ligv(:) = 0
+        o_info%norb_virt(:) = 0
+        o_info%norb_del(:)  = 0
+        o_info%norb(:,:) = 0
+        o_info%ngel = 0 
+        o_info%nocc = 0 
+        o_info%nligo= 0 
+        o_info%nact = 0 
+        o_info%nligv= 0 
+        o_info%nvirt= 0 
+        o_info%ndel = 0 
+        o_info%ntot = 0
+
+        ! v_info
+        v_info%stot = 1
+        v_info%sz   = 0
+        v_info%vec_irrep = 1
+        v_info%nvec = 1
+        v_info%ncfspref0 = 0 !> @todo check if 0 or 1
+        
+        ! det_info
+        det_info%nref0 = 1  
+        det_info%nref1 = 0
+        det_info%ndetM = 0
+        det_info%ndetcaslm = 0
+        det_info%ndet  = 1
+        det_info%ndet1  = 0
+        det_info%nmonoref0 = 0 
+        det_info%ndiref0   = 0
+
+        !sym_info
+        sym_info%iChTb(:,:) = 0
+        sym_info%iIrTb(:,:) = 0
+        
+        !prop_info
+        prop_info%nprop = 0
+        prop_info%whichprop(1:nprop_max) = "xxxxx"
+        
+      End Subroutine init_prop
+
+
diff --git a/src/jacscf.f b/src/jacscf.f
new file mode 100755
index 0000000000000000000000000000000000000000..ce16ef76d3f36b807e22fef419868a43ac8835da
--- /dev/null
+++ b/src/jacscf.f
@@ -0,0 +1,339 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+      subroutine jacobi_jacscf(e,v,H,nvec,ndim,ordre)
+      implicit real*8(a-h,o-p,r-z)
+      dimension e(ndim)
+      dimension v(ndim,ndim), H(ndim,ndim)
+      dimension hh(ndim*ndim), vv(ndim*ndim)
+      dimension inev(ndim)
+      logical debug, ordre
+      real*8 norm
+
+      debug = .false.
+      
+      do i = 1,ndim
+         e(i) = 0.d0
+         do j=1,ndim
+            v(j,i) = 0.d0
+         end do
+      end do
+      do i = 1,ndim*ndim
+         vv(i) = 0.d0
+         hh(i) = 0.d0
+      end do
+      do i=1,ndim
+         vv(i+(i-1)*nvec) = 1.d0 
+      end do
+
+c     Si matrice de dimension 1 ou 2 on diagonalise à la main
+      if (nvec.lt.1) then
+         stop ">>>> Erreur matrice de dimension  <1 <<<<<"
+      else if (nvec.eq.1) then
+         e(1) = h(1,1)
+         v(1,1) = 1.d0
+         return
+      else if (nvec.eq.2.and.(abs(h(1,2)).lt. 1.d-15)) then 
+         e(1) = h(1,1)
+         e(2) = h(2,2)
+         v(1,1) = 1.d0
+         v(2,2) = 1.d0
+         if (ordre.and.(h(2,2).lt.e(1))) then 
+            e(1) = h(2,2)
+            e(2) = h(1,1)
+            v(1,1) = 0.d0
+            v(2,1) = 1.d0
+            v(1,2) = 1.d0
+            v(2,2) = 0.d0
+         end if
+         return
+      !else if (nvec.eq.2) then
+         
+      end if
+
+c     on passe a une matrice triangulaire inferieure en ligne 
+      idet  = 0
+      do  jvec = 1,nvec      ! colonne
+         do  ivec = 1,jvec   ! ligne
+            idet = idet +1 
+            hh(idet) = h(ivec,jvec)
+         end do
+      end do
+      if (debug) then
+         write(6,*)"hh avant jac"
+         ish=0
+         do ivec = 1,nvec    
+            write(6,*) (hh(jvec + ish),   jvec=1,ivec)
+            ish = ish + ivec
+         end do
+      end if
+
+c     On diagonalise
+      call jacscf(hh,vv,e,nvec,nvec,1.d-15)
+
+      if (debug) then
+         write(6,*)"vv apres jac"
+         do jvec=1,nvec
+            jsh = (jvec-1)*nvec 
+            write(6,*) (vv(ivec + jsh),ivec=1,nvec) 
+         end do
+      end if
+
+c     on reordonne les vecteurs si demande et retransforme la matrice 
+      if (ordre) then
+         do i=1,nvec
+            inev(i) = i
+         end do
+         do ivec = 1,nvec
+            do jvec = ivec+1,nvec
+               if (e(inev(jvec)).lt.e(inev(ivec))) then
+                  itmp = inev(ivec)
+                  inev(ivec) = inev(jvec)
+                  inev(jvec) = itmp
+               end if
+            end do
+         end do
+         if (debug) then 
+            write(6,*) " jacscf : nouvel ordre"
+            write(6,*) (inev(i),i=1,nvec)
+         end if
+         do ivec = 1,nvec
+            v(ivec,1) = e(ivec)
+         end do
+         do ivec = 1,nvec
+            e(ivec) = v(inev(ivec),1) 
+         end do
+         do jvec = 1,nvec
+            jsh = (inev(jvec)-1)*nvec 
+            do ivec = 1,nvec
+               v(ivec,jvec) = vv(ivec + jsh) 
+            end do
+         end do
+      else
+         do jvec = 1,nvec
+            jsh = (jvec-1)*nvec 
+            do ivec = 1,nvec
+               v(ivec,jvec) = vv(ivec + jsh) 
+            end do
+         end do
+      end if
+      if (debug) then
+         write(6,*) "e=",e
+         write(6,*)"v apres ordre"
+         do jvec=1,nvec
+            write(6,*) (v(ivec,jvec),ivec=1,nvec) 
+         end do
+      end if
+
+c     On verifie que la diagonalisation est OK
+      do jvec = 1,nvec
+         tmp = 0.d0
+         do ivec = 1,nvec
+            tmp =  e(jvec) * v(ivec,jvec)
+            ttmp = 0.d0
+            do k = 1,nvec
+               ttmp = ttmp + h(ivec,k)*v(k,jvec)
+            end do
+            if (abs(ttmp-tmp).gt.1.d-12) then 
+               write(6,*) "vecteur ",  jvec, e(jvec), ordre
+               write(6,*) ">> jacscf erreur:", tmp,ttmp, ttmp-tmp
+            end if
+         end do
+      end do
+
+      
+
+      end 
+
+c----------------------------------------------------------------
+      subroutine jacscf(a,b,c,naa,nqq,epslon)
+c********************************************
+      implicit real*8(a-h,o-p,r-z)
+c
+c          find all eigenvalues and eigenvectors of a(*) by the
+c          jacobi method.
+c
+c          this program treats the orthogonal case (s=1)
+c      a(*) - input matrix to be diagonalized. (this matrix
+c             is stored in lower triangular form and is
+c             is destroyed during the calculation)
+c      b(*) - upon exiting this routine this array contains the
+c             eigenvectors stored in a rectangular compact form
+c      c(*) - upon exiting this routine this array contains the
+c             eigenvalues.
+c             naa=dimension of a
+c             nq=-1 causes b to be cleared to a unit matrix
+c             nq>0 b(*) contains an naa by nq array which will be
+c                  multiplied by the eigenvector matrix.
+c             nq should not be dimensioned<naa if nq>0.
+c            routine.
+c      epslon is the convergence criteria for off diagonal elements
+      dimension a(naa*naa),b(naa*naa),c(naa)
+      data zero/0.0d0/, half/0.5d0/, one/1.0d0/, two/2.0d0/,
+     *     three/3.0d0/,scale/0.909090909/,sc2/0.95238095/
+      nq=nqq
+      na=naa
+      nam=na-1
+c   set b to unit matrix if nq .le. 0
+      if(nq.gt.0) go to 120
+         k=1
+         nq=na
+         do 115 i=1,na
+            do 110 j=1,na
+               if(i.eq.j) go to 100
+                  b(k)=zero
+                  go to 105
+100            continue
+               b(k)=one
+105            continue
+               k=k+1
+110         continue
+115      continue
+c
+c      --- determine initial and final thresholds ---
+c
+120   continue
+      if(nam)325,310,125
+125   continue
+      k=1
+      sum1=zero
+      do 155 i=2,na
+         im=i-1
+         do 150 j=1,im
+            sum1=sum1+abs(a(k))
+            k=k+1
+150      continue
+         k=k+1
+155   continue
+      t=(na*(na-1))/2
+      sum1=sum1/t
+      k=1
+      amax=a(1)
+      amin=a(1)
+      do 160 j=2,na
+         k=k+j
+         if(a(k).gt.amax) amax=a(k)
+         if(a(k).lt.amin) amin=a(k)
+160   continue
+      t=(amax-amin)/dble(na)+sum1*two
+      thrshg=epslon*t
+      thresh=sum1
+      if(thresh.lt.thrshg) thresh=thrshg
+c<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< begin program loop 180
+180   continue
+      k=1
+      n=0
+      jd=1
+      kd=0
+      do 270 j=2,na
+         jd=jd+j
+         jj=j-1
+         kd=kd+nq
+         do 265 i=1,jj
+c
+c      --- test for large off diagonal element ---
+c
+            if(abs(a(k+i)).le.thresh) go to 265
+c
+c      --- compute rotation matrix ---
+c
+               n=n+1
+               id=i*(i+1)/2
+               alpha=(a(jd)-a(id))/(two*a(k+i))
+               t=sign(one/(abs(alpha)+sqrt(one+alpha*alpha)),alpha)
+               ca=sqrt(one+t*t)
+               cc=one/ca
+               s=-cc*t
+c
+c      --- apply rotation to elements i,i  i,j  j,j ---
+c
+               a(jd)=a(jd)+a(k+i)*t
+               a(id)=a(id)-a(k+i)*t
+               a(k+i)=zero
+               ka=jd-j
+               kb=id-i
+               kc=(i-1)*nq
+c
+c      --- apply rotation to vector matrix ---
+c
+               do 215 l=1,nq
+                  b(kd+l)=-s*b(kc+l)+cc*b(kd+l)
+                  b(kc+l)=ca*b(kc+l)-t*b(kd+l)
+215            continue
+c
+c      --- apply rotation to rest of operator matrix ---
+c
+               l1=i-1
+               l3=j-2
+               do 220 l=1,l1
+                  a(ka+l)=-s*a(kb+l)+cc*a(ka+l)
+                  a(kb+l)=ca*a(kb+l)-t*a(ka+l)
+220            continue
+               ka=ka+1
+               kb=kb+i
+               do 225 l=i,l3
+                  kb=kb+l
+                  a(ka+l)=-s*a(kb)+cc*a(ka+l)
+                  a(kb)= ca*a(kb)-t*a(ka+l)
+225            continue
+               ka=ka+j-1
+               kb=kb+j-1
+               do 230 l=j,nam
+                  ka=ka+l
+                  kb=kb+l
+                  a(ka)=-s*a(kb)+cc*a(ka)
+                  a(kb)=ca*a(kb)-t*a(ka)
+230            continue
+265      continue
+         k=k+j
+270   continue
+c
+c      --- test for convergence (thresh=thrshg and n=0) ---
+c
+      if(thresh.eq.thrshg) go to 285
+         thresh=thresh*scale
+         scale=scale*sc2
+         if(thresh.gt.thrshg) go to 290
+         thresh=thrshg
+         go to 290
+  285 if(n.eq.0) go to 310
+  290  continue
+      go to 180
+c>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end program loop 180
+  310  continue
+      ll=0
+315   continue
+      do 320 l=1,na
+         ll=ll+l
+         c(l)=a(ll)
+320   continue
+325   continue
+      return
+      end
diff --git a/src/lect_data.F90 b/src/lect_data.F90
new file mode 100644
index 0000000000000000000000000000000000000000..fcd39c8b6fa263c84b18b0311d3dbf4cb5fce230
--- /dev/null
+++ b/src/lect_data.F90
@@ -0,0 +1,617 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+Subroutine lect_data(g_info, prog_info, o_info, v_info, det_info, ener_info, &
+     bdav_info, sym_info)
+!!$------------------------------------------------------------
+!!$ Lecture des données 
+!!$ -------- Donness globales ---------------------------------
+  use files
+  use utils_char
+  use info
+  use dimensions
+
+  implicit none
+
+  type(g_infotype), intent(inout)   :: g_info
+  type(prog_infotype), intent(in)   :: prog_info
+  type(o_infotype), intent(inout)   :: o_info
+  type(v_infotype), intent(inout)   :: v_info
+  type(det_infotype), intent(inout) :: det_info
+  type(ener_infotype),intent(inout) :: ener_info
+  type(david_infotype),intent(inout):: bdav_info
+  type(sym_infotype), intent(inout) :: sym_info
+
+!!$ -------- Donnes locales -----------------------------------
+!  Integer :: irrep, jrrep, krrep, i
+!  Integer, dimension(g_info%nirrep) :: irtmp
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Lecture des namelists 
+!!$-----
+  
+  ! Lecture des transferts de données depuis Molcas ou autre
+  ! et calcul des nombres d'orbitals dans chaque categorie
+  rewind(f_input)
+  call read_infomolcasinp(f_input, g_info, o_info, sym_info)
+  rewind(f_input)
+  call read_orbinp(f_input, o_info)
+  !Verfication of the method and given orb kinds
+  call check_orb_vs_method(prog_info, o_info)
+  if (prog_info%id_cpu.eq.0) then         
+     write(f_output,'(a39)') "  Transfert d''information par namelist"
+  endif
+  
+
+  !Calcul de orb_info(i,iorb)
+  !i=1 : iorb's irrep
+  !i=2 : iorb's type (0 for frozen and 6 for del) 
+  call compute_orb_info(o_info, g_info%nirrep)
+  ! Lecture des donnees sur les vecteurs demandes
+  call read_vecinp(f_input, g_info, prog_info, v_info, det_info, ener_info)
+  ! Lecture des donnees pour la procedure de Davidson
+  call read_davidinp(f_input, bdav_info, prog_info)
+
+  
+  !Impressions infomolcasinp et orbinp
+  if (prog_info%id_cpu.eq.0) then
+     call wrt_infoinp(f_output, g_info, o_info, v_info, bdav_info)
+  end if
+  
+!!$!-----
+!!$!----- Calcul de la table de multiplication des irreps
+!!$!-----
+!!$  if (iIrTb(1,1) == 1) goto  2
+!!$  write(f_output,*) '>>> Irrep table not given -> recalculated <<<'
+!!$  do irrep = 1,g_info%nirrep
+!!$     iIrTb (irrep,irrep) = 1
+!!$  end do
+!!$  do irrep = 1,g_info%nirrep
+!!$     do jrrep = irrep+1,g_info%nirrep
+!!$        irtmp(:) = iChTb(:,irrep)*iChTb(:,jrrep)
+!!$        do krrep = 1,g_info%nirrep
+!!$           do i = 1,g_info%nirrep
+!!$              if (irtmp(i) /= iChTb(i,krrep)) goto 1
+!!$           end do
+!!$           iIrTb(irrep,jrrep) = krrep
+!!$           iIrTb(jrrep,irrep) = krrep
+!!$           exit
+!!$1          continue
+!!$        end do
+!!$     end do
+!!$  end do
+!!$2 continue
+!!$  ! vérification avec its
+!!$  do irrep = 1,g_info%nirrep
+!!$     do jrrep = 1,g_info%nirrep
+!!$        if  (iIrTb(irrep,jrrep).ne.its(irrep,jrrep)) then
+!!$           if (prog_info%id_cpu.eq.0) then 
+!!$              write(f_output,'(">>> Erreur dans la table de multiplication du groupe <<<")')
+!!$              write(f_output,'(4x, "iIrTb = ")')
+!!$              do krrep = 1,g_info%nirrep
+!!$                 write(f_output,'(4x,8(i2,2x))') iIrTb(1:g_info%nirrep,krrep)
+!!$              end do
+!!$              write(f_output,'(4x, "its   =")')
+!!$              do krrep = 1,g_info%nirrep
+!!$                 write(f_output,'(4x,8(i2,2x))') its(1:g_info%nirrep,krrep)
+!!$              end do
+!!$              call SASS_quit('>>> Irrep table incorrect <<<', f_output)
+!!$           end if
+!!$        end if
+!!$     end do
+!!$  end do
+
+  
+!!$==================================================================== 
+End Subroutine lect_data
+
+!$====================================================================
+!> @brief Read the general input and store it in the g_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] g_info Type for all general info
+!$====================================================================
+subroutine read_infomolcasinp(iunit, g_info, o_info, sym_info)
+
+  use dimensions
+  use utils_char
+  use info
+
+  implicit none
+
+  integer, intent(in)               :: iunit
+  type(g_infotype), intent(inout)   :: g_info
+  type(o_infotype), intent(inout)   :: o_info
+  type(sym_infotype), intent(inout) :: sym_info
+
+  integer(kd_int) :: nirrep, ntot
+  integer(kd_int), dimension(IRREP_MAX, IRREP_MAX) :: &
+      iChTb, iIrTb
+
+  namelist /infomolcasinp/ nirrep, ntot, iIrTb, iChTb
+
+  ! Initialisation
+  ntot = 0
+  nirrep = 1
+  iChTb(:,:) = 0
+  iIrTb(:,:) = 0
+ 
+  read(iunit, infomolcasinp)
+
+  if (nirrep.ne.1) &
+       call SASS_quit('>>> symmetry not implemented yet <<<',f_output)
+  if (nirrep.gt.IRREP_MAX) &
+       call SASS_quit('>>> nirrep > 8  : D2h group max <<<',f_output)
+
+  g_info%nirrep = nirrep
+  o_info%ntot   = ntot
+
+  sym_info%iIrTb(1:nirrep,1:nirrep)  = iIrTb(1:nirrep,1:nirrep) 
+  sym_info%iChTb(1:nirrep,1:nirrep)  = iChTb(1:nirrep,1:nirrep) 
+
+end subroutine read_infomolcasinp
+
+
+!$====================================================================
+!> @brief Read the orbital input and store it in the o_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] o_info Type for orbital info
+!$====================================================================
+subroutine read_orbinp(iunit, o_info)
+ 
+  use dimensions
+  use utils_char
+  use info
+
+  implicit none
+
+  integer, intent(in)             :: iunit
+  type(o_infotype), intent(inout) :: o_info
+
+  integer(kd_int), dimension(IRREP_MAX) :: norb_gel, norb_occ, &
+       norb_ligo, norb_act, norb_ligv, norb_virt, norb_del 
+
+  namelist /orbinp/ norb_gel, norb_occ, norb_ligo, norb_act, &
+       norb_ligv, norb_virt, norb_del
+
+  ! o_info
+  norb_gel(:)  = 0
+  norb_occ(:)  = 0
+  norb_ligo(:) = 0 
+  norb_act(:)  = 0
+  norb_ligv(:) = 0
+  norb_virt(:) = 0
+  norb_del(:)  = 0
+
+  read(iunit, orbinp)
+
+  o_info%norb_gel(:)  = norb_gel(:)
+  o_info%norb_occ(:)  = norb_occ(:)
+  o_info%norb_ligo(:) = norb_ligo(:)
+  o_info%norb_act(:)  = norb_act(:)
+  o_info%norb_ligv(:) = norb_ligv(:)
+  o_info%norb_virt(:) = norb_virt(:)
+  o_info%norb_del(:)  = norb_del(:)
+
+  ! Traitement des donness sur les classes d'orbitales
+  o_info%ngel  = sum(norb_gel)
+  o_info%nocc  = sum(norb_occ)
+  o_info%nligo = sum(norb_ligo)
+  o_info%nact  = sum(norb_act)
+  o_info%nligv = sum(norb_ligv)
+  o_info%nvirt = sum(norb_virt)
+  o_info%ndel  = sum(norb_del)
+
+  o_info%norb(:,0) =  norb_gel(:) 
+  o_info%norb(:,1) =  norb_occ(:) 
+  o_info%norb(:,2) =  norb_ligo(:) 
+  o_info%norb(:,3) =  norb_act(:) 
+  o_info%norb(:,4) =  norb_ligv(:) 
+  o_info%norb(:,5) =  norb_virt(:)
+  o_info%norb(:,6) =  norb_del(:) 
+  if (o_info%nact.gt.NACT_MAX) &
+       stop '>>> Error number of active orbitals too large <<<'
+  if (o_info%ntot  /= o_info%nocc + o_info%nligo + o_info%nact + &
+       o_info%nligv + o_info%nvirt ) &
+       stop '>>> Error in orbital numbers : check data <<<'
+
+end subroutine read_orbinp
+
+!$====================================================================
+!> @brief Verfication of the method and given orb kinds
+!> @author Elisa Rebolini
+!> @date Nov 2019
+!
+!> @param[in] prog_info Type for prog info
+!> @param[in] o_info Type for orbital info
+!$====================================================================
+subroutine check_orb_vs_method(prog_info, o_info)
+
+  use dimensions
+  use info
+  use utils_char
+
+  implicit none
+  
+  type(prog_infotype), intent(in):: prog_info
+  type(o_infotype), intent(in)   :: o_info
+
+
+  select case (prog_info%method)
+  case('CAS+S')
+     if ((o_info%nligo .ne. 0) .or. (o_info%nligv .ne. 0)) then
+        if (prog_info%id_cpu.eq.0) then
+           write(f_output,'(2(A,X,I0,X))') &
+                'nligo=',o_info%nligo,'nligv=',o_info%nligv
+           write(f_output,'(2A)') &
+                "Discrepancy between the orbital classification and the method ", &
+                prog_info%method
+           call SASS_quit( &
+                "Discrepancy between the orbital classification and the method", &
+                f_output)
+        endif
+     endif
+  case('CAS+SD')
+     if ((o_info%nocc .ne. 0) .or. (o_info%nvirt .ne. 0)) then
+        if (prog_info%id_cpu.eq.0) then
+           write(f_output,'(2(A,X,I0,X))') &
+                'nocc=',o_info%nocc,'nvirt=',o_info%nvirt
+           write(f_output,'(2A)') &
+                "Discrepancy between the orbital classification and the method ", &
+                prog_info%method
+           call SASS_quit( &
+                "Discrepancy between the orbital classification and the method", &
+                f_output)
+        endif
+     endif
+  end select
+  
+
+end subroutine check_orb_vs_method
+
+!$====================================================================
+!> @brief Read the vector input and store it in the v_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] g_info Type for general info
+!> @param[inout] v_info Type for vector info
+!> @param[inout] det_info Type for determinant info
+!$====================================================================
+subroutine read_vecinp(iunit, g_info, prog_info, v_info, det_info, ener_info)
+
+  use dimensions
+  use info
+  use utils_char
+
+  implicit none
+
+  integer, intent(in)             :: iunit
+  type(g_infotype), intent(inout) :: g_info
+  type(prog_infotype), intent(in) :: prog_info
+  type(v_infotype), intent(inout) :: v_info
+  type(det_infotype), intent(inout) :: det_info
+  type(ener_infotype),intent(inout) :: ener_info
+
+  integer (KIND=kd_int) :: stot, sz, vec_irrep, nvec, &
+       nref0, nelact, itmp
+
+  namelist /vecinp/ stot, sz, vec_irrep, nvec, nref0, nelact
+
+  ! v_info
+  stot = 1
+  sz   = 0
+  vec_irrep = 1
+  nvec = 1
+
+  nref0 = 1
+  nelact = 0
+
+  read(iunit, vecinp)
+  v_info%stot = stot
+  v_info%sz   = sz
+  v_info%vec_irrep = vec_irrep
+  v_info%nvec = nvec
+  allocate(ener_info%ener(nvec))
+  ener_info%ener(:) = 0.d0
+
+  
+  det_info%nref0 = nref0
+  g_info%nelact = nelact
+  g_info%na = (nelact + Sz)/2
+  g_info%nb = (nelact - Sz)/2
+
+  
+  if ((vec_irrep.gt.g_info%nirrep).or.(vec_irrep.lt.0)) &
+       call SASS_quit('>>> Error in irrep of seeked vectors <<<',f_output)
+  itmp = stot-1
+  if ((abs(sz).gt.itmp).or.(mod(sz,2)/=mod(itmp,2))) &
+       call SASS_quit('>>> Error in spin of seeked vectors <<<',f_output)
+  if (nelact.gt.NACT_MAX)  then
+     if (prog_info%id_cpu.eq.0) &
+          call SASS_quit('>>> Too many active electrons. Increase NACT_MAX and  kindact <<<',f_output)
+  end if
+
+end subroutine read_vecinp
+
+!$====================================================================
+!> @brief Write the orbital and general info in file iunit
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit File unit
+!> @param[in] g_info Type for general info
+!> @param[in] o_info Type for orbital info
+!$====================================================================
+subroutine wrt_infoinp(iunit, g_info, o_info, v_info, bdav_info)
+
+  use info
+
+  implicit none
+
+  integer, intent(in)          :: iunit
+  type(g_infotype), intent(in) :: g_info
+  type(o_infotype), intent(in) :: o_info
+  type(v_infotype), intent(in) :: v_info
+  type(david_infotype), intent(in) :: bdav_info
+  
+  Real(kd_dble)                :: tmp
+
+  character(len=20) :: fmt1 ='(a35,":",i4)'
+  character(len=20) :: fmt2 ='(a35,":",8(i4,2x))'
+  character(len=20) :: fmt3 ='(a35,":",9(i4,2x))'
+  character(len=20) :: fmt4 ='(a35,":",ES8.1))'
+
+  !Impressions infomolcasinp et orbinp
+  write(iunit,fmt1) "  Nbre d'irrep                     ", g_info%nirrep 
+  write(iunit,fmt1) "  Nbre total d'orbitales           ", o_info%ntot
+
+  write(iunit,fmt2) "  Nbre d'orbitales gelees          ",  &
+       o_info%norb_gel(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales occuppees       ",  &
+       o_info%norb_occ(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales lig. occ        ",  &
+       o_info%norb_ligo(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales actives         ",  &
+       o_info%norb_act(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales lig. virt       ",  &
+       o_info%norb_ligv(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales virtuelles      ",  &
+       o_info%norb_virt(1:g_info%nirrep)
+  write(iunit,fmt2) "  Nbre d'orbitales deletees        ",  &
+       o_info%norb_del(1:g_info%nirrep)
+
+  write(iunit,'(A,A)') "  Nbre d'orbitales total           : ",&
+       "ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total"
+  write(iunit,fmt3) " " ,  o_info%ngel, o_info%nocc, o_info%nligo,&
+       o_info%nact, o_info%nligv, o_info%nvirt, o_info%ndel, &
+       o_info%nocc + o_info%nligo + o_info%nact + o_info%nligv + o_info%nvirt, &
+       o_info%ngel + o_info%nocc + o_info%nligo + o_info%nact + o_info%nligv &
+       + o_info%nvirt + o_info%ndel
+
+
+  !Impressions vecinp et orbinp
+  write(iunit,*)     
+  write(iunit,fmt1) "  Nbre de vecteurs                 ", v_info%nvec  
+  write(iunit,fmt2) "  2S+1, 2Sz                        ", v_info%stot, v_info%sz
+  write(iunit,fmt2) "  Irrep                            ", v_info%vec_irrep
+  write(iunit,fmt2) "  Nbre d'electrons actifs          ", g_info%nelact
+  
+
+
+  !Impression info davidson
+  write(iunit,*)
+  write(iunit,fmt1)    "  Size of the Davidson Heff         ", bdav_info%Sizeheff
+  write(iunit,fmt1)    "  Nbr of Davidson super-iter        ", bdav_info%NitDavid
+  write(iunit,fmt4)    "  Orthogonality threshold           ", bdav_info%tol_orth
+  write(iunit,fmt4)    "  Normalisation threshold           ", bdav_info%tol_norm
+  write(iunit,fmt4)    "  Conv. threshold on vectors        ", bdav_info%tol_conv
+  if (bdav_info%conv_ener) then
+     write(iunit,fmt4) "  Conv. threshold on energies       ", bdav_info%tol_conv*bdav_info%tol_conv
+  else
+     tmp =  max(bdav_info%tol_conv*bdav_info%tol_conv, bdav_info%tol_orth/10, bdav_info%tol_norm/10, 1d-14)
+     write(iunit,fmt4) "  Expected threshold on energies    ", tmp
+     !     write(iunit,*)     " Conv. threshold on energies desactivated to activate set : conv_ener"
+  end if
+  write(iunit,fmt1)    "  Nbr of 1st iter (restart)         ", bdav_info%iter0
+
+  flush(iunit)
+end subroutine wrt_infoinp
+
+
+!$====================================================================
+!> @brief Compute orb_info (global variable in info) from o_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit File unit
+!> @param[in] g_info Type for general info
+!> @param[in] o_info Type for orbital info
+!$====================================================================
+subroutine compute_orb_info(o_info, nirrep)
+
+  use info
+  use dimensions
+
+  implicit none
+
+  type(o_infotype), intent(in) :: o_info
+  integer, intent(in) :: nirrep
+
+  integer :: iorb, irrep
+
+  ! Calcul de orb_info
+  allocate (orb_info(2, o_info%ntot+o_info%ngel+o_info%ndel))
+  orb_info(:,:) = -1
+  iorb = 0 
+  do irrep = 1, nirrep ! --- gel 
+     orb_info(1 , iorb+1:iorb+o_info%norb_gel(irrep)) = irrep
+     iorb = iorb + o_info%norb_gel(irrep)
+  end do
+  if (iorb /= o_info%ngel) &
+       call SASS_quit('>>> Error in number of frozen orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- occ
+     orb_info(1 , iorb+1:iorb+o_info%norb_occ(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_occ(irrep)) = 1
+     iorb = iorb + o_info%norb_occ(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc) &
+       call SASS_quit('>>> Error in number of occupied orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- ligo
+     orb_info(1 , iorb+1:iorb+o_info%norb_ligo(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_ligo(irrep)) = 2
+     iorb = iorb + o_info%norb_ligo(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc+o_info%nligo) &
+       call SASS_quit('>>> Error in number of ligand occupied  orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- act
+     orb_info(1 , iorb+1:iorb+o_info%norb_act(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_act(irrep)) = 3
+     iorb = iorb + o_info%norb_act(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc+o_info%nligo+o_info%nact) &
+       call SASS_quit('>>> Error in number of active orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- ligv
+     orb_info(1 , iorb+1:iorb+o_info%norb_ligv(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_ligv(irrep)) = 4
+     iorb = iorb + o_info%norb_ligv(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc+o_info%nligo+o_info%nact+o_info%nligv) &
+       call SASS_quit('>>> Error in number of ligand virtual orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- virt
+     orb_info(1 , iorb+1:iorb+o_info%norb_virt(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_virt(irrep)) = 5
+     iorb = iorb + o_info%norb_virt(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc+o_info%nligo+o_info%nact+o_info%nligv+&
+       o_info%nvirt) &
+       call SASS_quit('>>> Error in number of virtual orbitals <<<',f_output)
+  do irrep = 1, nirrep ! --- del
+     orb_info(1 , iorb+1:iorb+o_info%norb_del(irrep)) = irrep
+     orb_info(2 , iorb+1:iorb+o_info%norb_del(irrep)) = 6
+     iorb = iorb + o_info%norb_del(irrep)
+  end do
+  if (iorb /= o_info%ngel+o_info%nocc+o_info%nligo+o_info%nact+o_info%nligv+&
+       o_info%nvirt+o_info%ndel) &
+       call SASS_quit('>>> Error in number of deleted orbitals <<<',f_output)
+  !do i=1,o_info%ntot+o_info%ngel+o_info%ndel
+  !   print *,  orb_info(:,i)
+  !end do
+
+end subroutine compute_orb_info
+
+
+!$====================================================================
+!> @brief Read the vector input and store it in the v_info
+!> @author Elisa Rebolini
+!> @date Oct 2017
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] g_info Type for general info
+!> @param[inout] v_info Type for vector info
+!> @param[inout] det_info Type for determinant info
+!$====================================================================
+subroutine read_davidinp(iunit, bdav_info, prog_info)
+
+  use dimensions
+  use info
+
+  implicit none
+
+  integer, intent(in)                :: iunit
+  type(david_infotype),intent(inout) :: bdav_info
+  type(prog_infotype), intent(in)    :: prog_info
+  
+  integer (KIND=kd_int) :: SizeheffDavidson, NiterDavidson, iter0
+  real(kd_dble) :: tol_orth, tol_norm, tol_conv
+  real(kd_dble) :: tol_max
+  Logical :: conv_ener, debug_dav
+  
+  namelist /davidinp/  SizeheffDavidson, NiterDavidson, tol_orth, tol_norm, tol_conv, iter0, conv_ener, debug_dav
+
+  ! bdav_info
+  SizeheffDavidson = 10
+  NiterDavidson    = 100
+  tol_max  = 1.d-20
+  tol_orth = 1.d-15
+  tol_norm = 1.d-15
+  tol_conv = 1.d-8
+  iter0    = 0
+  conv_ener = .false.
+  debug_dav = .false.
+  
+  read(iunit, davidinp)
+  if (SizeheffDavidson.le.1) SizeheffDavidson = 2
+  bdav_info%Sizeheff = SizeheffDavidson
+  if (NiterDavidson.le.0) NiterDavidson = 1
+  bdav_info%NitDavid = NiterDavidson
+  if (tol_orth.lt.tol_max) then 
+     write(f_output,*) " tol_orth < 1.d-20 : irrealistic in double precision "
+  else if  (tol_orth.gt.tol_conv/10) then
+     tol_orth = max(tol_conv/10,tol_max) 
+     write(f_output,*) " tol_orth too low : increased to ",  tol_orth 
+  end if
+  bdav_info%tol_orth = tol_orth
+  if (tol_norm.lt.tol_max) then 
+     write(f_output,*) " tol_norm < 1.d-20 : irrealistic in double precision "
+  else if  (tol_norm.gt.sqrt(tol_conv/10)) then
+     tol_norm = max(sqrt(tol_conv/10),tol_max) 
+     write(f_output,*) " tol_norm too low : increased to ",  tol_norm 
+  end if
+  bdav_info%tol_conv  = tol_conv
+  bdav_info%tol_norm  = tol_norm
+  bdav_info%iter0     = iter0
+  bdav_info%conv_ener = conv_ener
+  bdav_info%debug_dav = debug_dav
+
+  if (SizeheffDavidson.lt.1) &
+       call SASS_quit('>>> Error in SizeheffDavidson : must be at least 1 (default = 10) <<<',f_output)
+  if (NiterDavidson.lt.1) &
+       call SASS_quit('>>> Error in NiterDavidson : must be at least 1  (default = 100) <<<',f_output)
+
+  if (prog_info%iprintHmat .gt. 0) then
+     bdav_info%NitDavid = 1
+     write(f_output,*) " Nb of Davidson iteration set to 1 due to the keyword iprintHmat"
+  endif
+     
+end subroutine read_davidinp
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/lect_data_prop.F90 b/src/lect_data_prop.F90
new file mode 100644
index 0000000000000000000000000000000000000000..98da6786ad878de9e7dd535918982043658cbb0b
--- /dev/null
+++ b/src/lect_data_prop.F90
@@ -0,0 +1,203 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!!$==================================================================== 
+!$====================================================================
+!> @brief Read the x_info for property code 
+!> @author MBL
+!> @date avril 2020
+!
+!> @param[inout] prog_info,g_info,o_info,v_info,det_info,sym_info,f_info
+!$====================================================================
+Subroutine lect_info(prog_info,g_info,o_info,v_info,det_info,&
+     nblock,shtblkdet,nblkdet,deter_index,sym_info,iunit)
+  use files
+  use info
+  use info_prop
+
+  implicit none
+  
+  type(prog_infotype),   intent(inout) :: prog_info
+  type(g_infotype),      intent(inout) :: g_info
+  type(o_infotype),      intent(inout) :: o_info
+  type(v_infotype),      intent(inout) :: v_info
+  type(det_infotype),    intent(inout) :: det_info
+  type(sym_infotype),    intent(inout) :: sym_info
+  Integer, dimension(:), allocatable, intent(out) :: shtblkdet, nblkdet, deter_index
+  integer,               intent(inout) :: nblock
+  integer,               intent(in)    :: iunit
+
+  read(iunit) prog_info
+  read(iunit) g_info
+  read(iunit) o_info
+  read(iunit) v_info
+  read(iunit) det_info
+  read(iunit) nblock
+  allocate(shtblkdet(nblock), nblkdet(nblock), deter_index(nblock))
+  shtblkdet(:) = 0
+  nblkdet(:)   = 0
+  deter_index  = 99
+  print *, "  nblock=",nblock
+  read(iunit) shtblkdet(1:nblock), nblkdet(1:nblock), deter_index(1:nblock)
+  read(iunit) sym_info
+
+end Subroutine lect_info
+
+
+!$====================================================================
+!> @brief Read input for properties prop_info
+!> @author MBL
+!> @date avril 2020
+!
+!> @param[in] iunit Input file unit
+!> @param[inout] prop_info Type for properties added info
+!$====================================================================
+subroutine read_propinp(prop_info, nref0lu, iunit)
+  use dimensions
+  use utils_char
+  use info_prop
+
+  implicit none
+  integer, intent(in)                :: iunit
+  type(prop_infotype), intent(inout) :: prop_info
+  integer(kd_int),     intent(inout) :: nref0lu
+  integer(kd_int) :: nprop
+  character*5, dimension(:), allocatable :: whichprop
+  integer (KIND=kd_int) :: stot, sz, vec_irrep, nvec, &
+       nref0, nelact, itmp
+  
+  namelist /propinp/ nprop, whichprop
+  namelist /vecinp/ stot, sz, vec_irrep, nvec, nref0, nelact
+
+  ! vecinp
+  stot = 1
+  sz   = 0
+  vec_irrep = 1
+  nvec = 1
+
+  nref0 = 1
+  nelact = 0
+  read(iunit, vecinp)
+
+  nref0lu = nref0
+
+  ! prop_info
+  rewind(iunit)
+  nprop = 0
+  allocate(whichprop(nprop_max))
+  whichprop(1:nprop_max) = "xxxxx"
+  read(iunit, propinp)
+
+  prop_info%nprop = nprop
+  prop_info%whichprop(1:nprop) =  whichprop(1:nprop)
+
+
+end subroutine read_propinp
+
+!$====================================================================
+!> @brief Read bdet file
+!> @author MBL
+!> @date avril 2020
+!
+!> @param[in] iunit Input file unit
+!> @param[in] ndet Input number of det to be read
+!> @param[inout] det array
+!$===================================================================
+subroutine  read_bdet(det,ndet,iunit)
+  use typedet
+
+  implicit none
+  type(deter), dimension(ndet), intent(inout) ::  det
+  integer,                         intent(in) :: iunit, ndet
+  integer :: idet
+  
+  do idet = 1,ndet
+     read(iunit) det(idet)%detact, det(idet)%dettr,  det(idet)%detprt
+  end do
+  
+end subroutine read_bdet
+
+
+  !$====================================================================
+  !> @brief Read vectors  file f_restart
+  !> @author MBL
+  !> @date Avril  2020
+  !
+  !> @param[inout] psi :  vectors
+  !> @param[in] ndet : Nb of determinants
+  !> @param[in] nvec : Number of states 
+  !$==================================================================== 
+subroutine  lect_vect(psi, ener, ndet, nvec)
+  use dimensions
+  use files
+  implicit none
+  integer, intent(in) :: ndet, nvec
+  real(kd_dble), dimension(ndet,nvec), intent(inout) :: psi
+  real(kd_dble), dimension(nvec),      intent(inout) :: ener
+  real(kd_dble) :: Ecoeur, potnuc
+  Integer :: nvectot, ndettot, nconv, iter
+  Integer :: idet, ivec, ierr
+
+  rewind (f_restart)
+  read(f_restart) nvectot,ndettot,nconv, iter
+  if (nvec.ne.nvectot) then
+     call SASS_quit('Error in nb of vectors read from file', f_output)
+  end if
+  if (ndet.ne.ndettot) then
+     write(f_output,'("   ndet =", i10, "  ndettot =", i10)') ndet, ndettot
+     call SASS_quit('Error in nb of determinants read from file', f_output)
+  end if
+  !print *, " nvectot,ndettot,nconv, iter=", nvectot,ndettot,nconv, iter
+  
+  read(f_restart) Ecoeur,PotNuc
+  !print *, " Ecoeur,PotNuc=",Ecoeur,PotNuc
+  
+  read(f_restart) (ener(ivec), ivec =1,nvec)
+  ener(1:nvec) =   ener(1:nvec) + Ecoeur + PotNuc
+  !print *, "ener read ", ener
+  
+  do ivec = 1, nvectot
+     read(f_restart,iostat=ierr) (psi(idet,ivec),idet=1,ndet)
+  end do
+  
+  write(f_output,*) "    Vectors read from file"
+  write(f_output,*) "    Nbre of vectors read      =", nvectot
+  write(f_output,*) "    Nbre of determinants      =", ndettot
+  write(f_output,*) "    Nbre of converged vectors =", nconv
+  write(f_output,*) "    Last iteration            =", iter
+  write(f_output,*) "    Nuclear potential energy  =", PotNuc
+  write(f_output,*) "    Core electrons energy     =", Ecoeur
+  flush(f_output)
+  
+end subroutine lect_vect
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/lect_int.F90 b/src/lect_int.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8feb246e5c3bbee6163160d6b4e4a20301095829
--- /dev/null
+++ b/src/lect_int.F90
@@ -0,0 +1,1315 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!$============================================================
+!> @brief Reads the one- and two-electron integrals
+!! Builds the Fock matrix
+!$============================================================
+module integrales
+
+  use info
+  use utils_char
+  use files
+  use utils_twoint
+
+  implicit none
+
+contains
+
+  !$============================================================
+  !> @brief Read the integrales from file
+  !> @author MB Lepetit
+  !> @date 2017
+  !$============================================================
+  Subroutine  lect_int(hcoeur, g_info, prog_info, o_info, ord_info, &
+       ener_info, int_info, f_output)
+!!$------------------------------------------------------------
+!!$ Lecture des integrales dur TraInt et TraOne 
+!!$
+!!$ MaxBfn     : =10000  nbre max de fonctions de base dans Molcas
+!!$ y64_traone : = .true.  donnes ecrites en 64 bits
+!!$ Potnuc     : potentiels des noyaux (lu ds TraOne)
+!!$ nsym       : nbre d'irrep (lu ds TraOne)
+!!$ norbs0     : nbre d'orbitales par sym avant gel (lu ds TraOne)
+!!$ norbs      : nbre d'orbitales par sym apres gel (lu ds TraOne)
+!!$ BsLbl      : nom des orbitales
+!!$ nbint      : Nbre d'intégrales à lire
+!!$ iadrone1   : adresse du début des integrales Mono ds TraOne
+!!$ OneInt     : (i,j) integrales monoelectroniques 
+!!$ min_Block_Length : longueur des blocks dans les fichiers 
+!!$            :  d'intégrales de MOLCAS
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+
+!!$ -------- Donnes locales -----------------------------------
+    
+    type(g_infotype), intent(in)         :: g_info
+    type(prog_infotype), intent(in)      :: prog_info
+    type(o_infotype), intent(in)         :: o_info
+    type(ord_infotype), intent(in)       :: ord_info
+    type(ener_infotype), intent(inout)   :: ener_info
+    type(int_infotype), intent(inout)    :: int_info
+    integer, intent(in)                  :: f_output
+    Real(KIND=kd_dble), dimension(:,:), allocatable :: hcoeur
+
+    integer                              :: n
+    Character*40                         :: file_TraOne, file_TraInt
+    
+    !> C interface defined in cio.c
+    Integer                              :: c_open, c_read, c_lseek, c_close
+    integer                              :: cf_tone, cf_tint
+    integer                              :: krc
+    Integer, dimension(66)               :: itoc
+    Logical                              :: y64_traone, y64_traint
+    !Integer*8, dimension(:), allocatable :: itoc8
+
+    Logical :: debugl=.false.
+    Integer :: MaxBfn=10000 ! nbre max de fonctions de base dans Molcas
+    Integer, parameter :: min_Block_Length=1024 ! longueur
+    Logical :: OK
+    !        Integer*8, dimension(120) :: ii64
+    Integer :: ifac, ilong, iadrone
+    Integer :: idisk, nTcOneMo, nTraToc, nTraBuf, &
+         iAdrOne1, iAdrOne2, iadrtwo
+    Real*8, dimension(:), allocatable :: fiijj, ijkl ! buffer de lecture des integrales
+    Real*8 :: oneham
+
+    Integer, dimension(8) :: norbs0, norbs, norbs_gel, norbs_del 
+    Integer :: nsym, nbint
+    Real*8, dimension(:,:), allocatable :: oneint
+    Character*5, dimension(2,MxOrb) :: BsLbl
+
+    Integer :: iorb, jorb, korb, isym
+    Integer :: i, k, ibid, nn, is  
+    Integer :: ni, nj, nk, nl
+    Integer :: n1,n2,n3,n4
+    Integer :: nsp, nsq, nsr, nss, nt, nu, nv, nx
+    Integer :: nbp, nbq, nbr, nbs
+    Integer :: nspq, nssm, nspqr, norbp, ntm, nxm, lnssm
+    Integer :: iout
+    Integer :: numax, numin
+
+    integer :: ngel, nocc, nligo, nact, nligv, nvirt, ntot
+    !real :: t1,t2
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------  
+!!$-----
+!!$----- TraOne preparation
+!!$-----
+    ntot = o_info%ntot
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+
+    if (prog_info%id_cpu.eq.0) then
+       !write(f_output,*)
+       write(f_output,*)" >>> Lecture des integrales TraOne"
+    endif
+    
+    ! Ouverture du fichier
+    if (prog_info%Yprefix) then
+       !      call lowercase(prog_info%prefix)
+       call noblancs(prog_info%prefix,n)
+       file_traone = prog_info%prefix(1:n)//".TraOne"
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) "     Ouverture TraOne = ",&
+               prog_info%prefix(1:n)//".TraOne"
+       endif
+       cf_tone = c_open(trim(file_traone)//char(0))
+    else
+       file_traone = "TraOne"
+       cf_tone=c_open(trim(file_traone)//char(0))
+       if (prog_info%id_cpu.eq.0) write(f_output,*) "  Ouverture TraOne = ","TraOne"
+    end if
+
+    ! Verifier 32 ou 64 bits en regardant si le debut du fichier
+    ! TraOne est en 32 ou 64 bits
+    itoc(:)  = 0 
+    krc = c_lseek(cf_tone,0) ! on positionne le pointeur au debut du fichier 
+    krc = c_read(cf_tone,itoc,64*4) ! on lit 64*4 bits à partir de
+    ! cette position et le met dans itoc
+    y64_traone = (itoc(2)==0)      ! si 64 bits, itoc(2)==0
+    if (y64_traone) then
+       if (prog_info%id_cpu.eq.0) &
+            write(f_output,*) " Lecture TraOne en entiers 64 bits"
+       allocate(oneint(ngel+1 : ngel+ntot, &
+            ngel+1 : ngel+ntot))
+       !allocate(oneint(ntot, ntot))
+       oneint(:,:) = 0.d0
+       call read_traone_64(g_info, prog_info, o_info, ord_info, ener_info, &
+            int_info, cf_tone, f_output, oneint, nbint)
+       int_info%n_1int = nbint
+       hcoeur(:,:) = oneint(:,:)
+       deallocate(oneint)
+    else
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,*) "  Lecture TraOne en entiers 32 bits"
+          call SASS_quit(">>>> Lecture entiers 32 bits pas programmée <<<<",f_output)
+       endif
+    end if
+    krc = c_close(cf_tone)
+    
+!-----
+!----- TraInt preparation
+    !-----
+
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,*)
+       write(f_output,*)" >>> Lecture des integrales TraInt"
+       flush(f_output)
+    endif
+    ! Ouverture du fichier
+    if (prog_info%Yprefix) then
+       ! call lowercase(prog_info%prefix)
+       call noblancs(prog_info%prefix,n)
+       file_traint = prog_info%prefix(1:n)//".TraInt"
+       cf_tint      = c_open(trim(file_traint)//char(0))
+       if (prog_info%id_cpu.eq.0) &
+            write(f_output,*) "     Ouverture TraInt = ",&
+            prog_info%prefix(1:n)//".TraInt"
+    else
+       file_traint = "TraInt"
+       cf_tint=c_open(trim(file_traint)//char(0))
+       if (prog_info%id_cpu.eq.0) &
+            write(f_output,*) "     Ouverture TraInt = ",file_traint
+    end if
+
+    y64_traInt = y64_traone
+    if (y64_traInt) then
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) " Lecture TraInt en entiers 64 bits"
+          flush(f_output)
+       endif
+       call read_traint_64(g_info, prog_info, o_info, ord_info, ener_info, &
+            int_info, cf_tint, f_output)
+    else
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,*) "  Lecture TraInt en entiers 32 bits"
+          call SASS_quit(">>>> Lecture entiers 32 bits pas programmée <<<<",f_output)
+       end if
+    endif
+    
+    krc = c_close(cf_tint)
+    
+  end Subroutine lect_int
+
+  
+  !$====================================================================
+  !> @brief Read the 1-e integrals <p|h|q> from the TraOne file in 64bits
+  !> @author MBL
+  !
+  !> @param[in] g_info
+  !> @param[in] prog_info
+  !> @param[in] o_info
+  !> @param[in] ord_info
+  !> @param[in] cf_tone
+  !> @param[in] f_output
+  !$====================================================================
+  subroutine read_traone_64(g_info, prog_info, o_info, ord_info, ener_info, &
+       int_info, cf_tone, f_output, oneint, nbint)
+
+    type(g_infotype), intent(in)         :: g_info
+    type(prog_infotype), intent(in)      :: prog_info
+    type(o_infotype), intent(in)         :: o_info
+    type(ord_infotype), intent(in)       :: ord_info
+    type(ener_infotype), intent(inout)   :: ener_info
+    type(int_infotype), intent(in)       :: int_info
+    integer, intent(in)                  :: cf_tone
+    integer, intent(in)                  :: f_output
+    real*8, dimension(:,:), allocatable  :: oneint
+    integer, intent(out)                 :: nbint
+    logical :: debugl=.false.
+    
+    integer :: krc
+    integer :: c_open, c_read, c_lseek, c_close 
+    integer*8, dimension(:), allocatable :: itoc8
+    integer :: idisk, nTcOneMo
+    integer :: iAdrOne1, iAdrOne2, iAdrOne
+
+    integer :: nsym
+    integer :: ntot, ngel, nocc, nligo, nact, nligv, nvirt, ndel, nirrep
+    integer, dimension(8) :: norbs0, norbs, norbs_gel, norbs_del
+
+    integer :: nn, k, n, i, isym, korb, jorb, iorb, ni, nj
+
+    real*8 :: oneham, potnuc
+    real*8, dimension(:), allocatable :: fiijj
+    
+    character*5, dimension(2,MxOrb) :: BsLbl
+
+    !Initialisation
+    ntot = o_info%ntot
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ndel = o_info%ndel
+
+    nirrep = g_info%nirrep
+
+    iDisk = 0
+    krc   = c_lseek(cf_tone,iDisk)  
+
+    ! Lire les pointeurs de TraOne
+    nTcOneMo = 64
+    allocate(itoc8(64))
+    itoc8(:) = 0
+    krc = c_read(cf_tone,itoc8,nTcOneMo*8) ! lecture de TCONEMO(nTcOneMo)
+    if (debugl)  call wrt_debug_itoc8(itoc8,nTcOneMo,0)
+    if (krc.le.0) then
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) 'krc',krc
+          call SASS_quit(">>> Erreur de lecture dans TraOne : TocTraOne <<<",f_output)
+       end if
+    endif
+    iDisk = iDisk + nTcOneMo*8
+    !iAdrOne  = itoc8(2) ! adresse des coef des MO sur AO
+    iAdrOne1 = itoc8(2) ! Hcoeur des occ (+gel?) (Hcoeur-matrix for inactive orbitals)
+    iAdrOne2 = itoc8(3) ! T - operateur cinétique
+    !  itoc8(4) ! matrice de recouvrement
+    !  itoc8(5) ! infos à nouveau
+    
+    ! lecture de ecor
+    krc   = c_lseek(cf_tone,iDisk)
+    krc = c_read(cf_tone,potnuc,8)
+    if (krc.le.0) then
+       write(f_output,*) 'krc',krc
+       call SASS_quit(">>> Erreur de lecture dans TraOne : potnuc <<<" ,f_output)
+    endif
+    iDisk = iDisk + 64*8
+    if (prog_info%id_cpu.eq.0) &
+         write(f_output, '("  Potnuc = ", f20.8)') potnuc
+    ener_info%potnuc = potnuc
+
+     ! nbre d'irrep
+    krc   = c_lseek(cf_tone,iDisk)  
+    itoc8(:) = 0
+    krc = c_read(cf_tone,itoc8,8*8)
+    if (krc.le.0) then
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) 'krc',krc
+          call SASS_quit(">>> Erreur de lecture dans TraOne : nsym <<<",f_output)
+       end if
+    endif
+    iDisk = iDisk + 64*8
+    nsym = itoc8(1)
+    if (prog_info%id_cpu.eq.0) &
+         write(f_output,'("  Nombre d''irrep lu ds TraOne = ",I2)') nsym
+    if (nsym.ne.nirrep) then
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,'(">>> Erreur nsym =",I2,&
+               " lu dans TraOne different de nirrep =",I2)') &
+               nsym, nirrep
+          call SASS_quit('Check symmetry input',f_output)
+       end if
+    end if
+
+    ! nbre d'orbitales par sym avant gel
+    norbs0(1:8) = 0
+    itoc8(:)    = 0
+    krc   = c_lseek(cf_tone,iDisk)  
+    krc = c_read(cf_tone,itoc8,64*8)
+    if (krc.le.0)  then
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) 'krc',krc
+          call SASS_quit(">>> Erreur de lecture dans TraOne : norbs0 <<<",f_output)
+       end if
+    end if
+    iDisk = iDisk + 64*8
+    norbs0(1:8) = itoc8(1:8)
+    if (debugl)  then 
+         if (prog_info%id_cpu.eq.0)  &
+              write(f_output,'("  Nombre d''orb par sym, av gel, lu ds TraOne = ", 8(I4,2x))') norbs0(1:8)
+      end if
+    ! Verification du nombre d'orbitales par symetrie avant gel
+    nn = 0
+    do k = 1,8
+       nn = nn + norbs0(k)
+    end do
+    
+    if (nn .ne. ntot+ngel+ndel) then
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,'(">>> Erreur ntot+ngel+ndel =",I4,&
+               " lu dans TraOne different de ntot+ngel+ndel =",I4)') nn, ntot+ngel+ndel
+          call SASS_quit("Check number of orbitals",f_output)
+       end if
+    end if
+    
+    ! nombre d'orbitales par symetrie apres gel
+    norbs(1:8) = 0
+    itoc8(:)   = 0
+    krc   = c_lseek(cf_tone,iDisk)  
+    krc=c_read(cf_tone,itoc8,64*8)
+    if (krc.le.0) then
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,*) 'krc',krc
+          call SASS_quit(">>> Erreur de lecture dans TraOne : norbs <<<",f_output)
+       end if
+    endif
+    iDisk = iDisk + 64*8
+    norbs(1:8) = itoc8(1:8)
+    if (debugl.and.prog_info%id_cpu.eq.0) &
+         write(f_output,'("  Nombre d''orb par sym, ap gel, lu ds TraOne = ",&
+         8(I4,2x))') norbs(1:8)
+    nn = 0
+    do k = 1,8
+       nn = nn + norbs(k)
+    end do
+    if (nn .ne. ntot) then
+       if (prog_info%id_cpu.eq.0)  then 
+          write(f_output,'(">>> Erreur ntot =",I4,&
+               " lu dans TraOne different de ntot =",I4)') nn, ntot
+          call SASS_quit("Check orbital numbers after motra",f_output)
+       end if
+    end if
+
+    ! nombre d'orbitales gelees par symetrie 
+    norbs_gel(1:8) = 0
+    itoc8(:)       = 0
+    krc   = c_lseek(cf_tone,iDisk)  
+    krc=c_read(cf_tone,itoc8,64*8)
+    if (krc.le.0)  then
+       if (prog_info%id_cpu.eq.0)  then
+          write(f_output,*) 'krc',krc
+          call SASS_quit(">>> Erreur de lecture dans TraOne : norbs_gel <<<",f_output)
+       end if
+    endif
+    iDisk = iDisk + 64*8
+    norbs_gel(1:8) = itoc8(1:8)
+    if (debugl)  write(f_output,'("  Nombre d''orb gelees par sym lu ds TraOne = ",&
+         8(I4,2x))') norbs_gel(1:8)
+    nn = 0
+    do k = 1,nsym
+       nn = nn + norbs_gel(k)
+    end do
+    if (nn.ne.ngel) then
+       if (prog_info%id_cpu.eq.0) then 
+          write(f_output,'(">>> Erreur ngel =",I2,&
+               " lu dans TraOne different de ngel =",I2)') nn, ngel
+          call SASS_quit("Check orbital numbers",f_output)
+       end if
+    end if
+
+    ! nombre d'orbitales deletes par symetrie 
+    norbs_del(1:8) = 0
+    itoc8(:)       = 0
+    krc   = c_lseek(cf_tone,iDisk)  
+    krc=c_read(cf_tone,itoc8,64*8)
+    if (krc.le.0) &
+         write(f_output,*) ">>> Erreur de lecture dans TraOne : norbs_del <<<"  
+    iDisk = iDisk + 64*8
+    norbs_del(1:8) = itoc8(1:8)
+    if (debugl)  write(f_output,'("  Nombre d''orb delete par sym lu ds TraOne = ",&
+         8(I4,2x))') norbs_del(1:8)
+    nn = 0
+    do k = 1,nsym
+       nn = nn + norbs_del(k)
+    end do
+    if (nn.ne.ndel) then
+       write(f_output,'(">>> Erreur ndel =",I2,&
+            " lu dans TraOne different de ndel =",I2)') nn, ndel
+       call SASS_quit('Error ndel', f_output)
+    end if
+
+    ! Label des orbitales 
+    BsLbl(:,:) = '     '
+    krc   = c_lseek(cf_tone,iDisk)  
+    nn  = ntot+ngel+ndel
+    krc = c_read(cf_tone,BSLBL,5*2*nn*8) 
+    if (krc.le.0) then
+       write(f_output,*) ">>> Erreur de lecture dans TraOne : BSLbl <<<"
+       call SASS_quit('Error BSLbl', f_output)
+    end if
+    ! iDisk = iDisk + 5*2*MxOrb*8
+    n = mod(nn,64)
+    if (n.eq.0) then 
+       n = nn/64
+    else
+       n = nn/64+1
+    end if
+    iDisk = iDisk + n*64*8
+    if (debug) then
+       write(f_output, '("  BSLbl = ")') 
+       i = 0
+       do isym = 1,nirrep
+          write(f_output,'("    Irrep = ",i2)') isym
+          do n = 1, norbs0(isym)
+             i = i + 1
+             write(f_output, '(6x,i4,2x,2a5)') i,BSLBL(1,i),BSLBL(2,i)
+          end do
+       end do
+    endif
+    
+!!$-----
+!!$----- TraOne Lecture des integrales monoelectroniques
+!!$-----
+    !write(*,*) norbs(:)
+    nbint = 0
+    norbs(1:8) = 0
+    do isym = 1,nirrep
+       norbs(isym) = o_info%nOrb(isym,1) + &
+            o_info%nOrb(isym,2) + o_info%nOrb(isym,3) + &
+            o_info%nOrb(isym,4) + o_info%nOrb(isym,5)
+       nbint = nbint + nOrbs(isym)*(nOrbs(isym)+1)/2
+    end do
+    !write(*,*) norbs(:)
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,*) " Nombre d'integrales a lire = ",nbint   
+    endif
+    !int_info%n_1int = nbint
+    
+    allocate(fiijj(nbint)) ! buffer
+    ! on positionne le pointeur et alloue les tableaux
+    krc = c_lseek(cf_tone,iAdrOne1*64*8)
+    ! Lecture
+    krc = c_read(cf_tone,fiijj,nbint*8)
+    if (krc.le.0) then 
+       write(f_output,*) ">>> Erreur de lecture dans TraOne : integrales <<<"
+       call SASS_quit('Error fiijj', f_output)
+    else
+       if (prog_info%id_cpu.eq.0) &
+            write(f_output,*) &
+            " Nombre d'integrales mono-electroniques lues  = ",nbint  
+    end if
+
+    ! on reordonne les integrales 
+    n = 0
+    korb = 0
+    do isym  = 1,nirrep
+       korb = o_info%norb_gel(isym)
+       !write(*,*) 'Nb orbitals', norbs(isym)
+       do jorb = korb+1, korb+nOrbs(isym)
+          do iorb = korb +1, jorb
+             n = n+1
+             oneham = fiijj(n)
+             ni = ord_info%ord(iorb,isym)
+             nj = ord_info%ord(jorb,isym)
+             oneint(ni,nj) = oneham
+             oneint(nj,ni) = oneham
+             !write(*,*) ni,nj, oneham
+          end do
+       end do
+    end do
+    
+    ! Fin TraOne
+    deallocate(itoc8)
+    deallocate(fiijj)
+    
+  end subroutine read_traone_64
+
+
+  !$====================================================================
+  !> @brief Read the 2-e integrals (pq|rs) = <pr|qs> from the TraInt
+  !! file in 64bits
+  !> @author MBL
+  !
+  !> @param[in] g_info
+  !> @param[in] prog_info
+  !> @param[in] o_info
+  !> @param[in] ord_info
+  !> @param[in] cf_tone
+  !> @param[in] f_output
+  !$====================================================================
+  subroutine read_traint_64(g_info, prog_info, o_info, ord_info, ener_info, &
+       int_info, cf_tint, f_output)
+
+    type(g_infotype), intent(in)         :: g_info
+    type(prog_infotype), intent(in)      :: prog_info
+    type(o_infotype), intent(in)         :: o_info
+    type(ord_infotype), intent(in)       :: ord_info
+    type(ener_infotype), intent(inout)   :: ener_info
+    type(int_infotype), intent(inout)    :: int_info
+    integer, intent(in)                  :: cf_tint
+    integer, intent(in)                  :: f_output
+ 
+    logical :: debugl=.false.
+    
+    integer :: krc
+    integer :: c_open, c_read, c_lseek, c_close
+    integer*8, dimension(:), allocatable :: itoc8
+    integer :: idisk, nTraToc, nTraBuf
+    integer :: iAdrTwo
+
+    integer :: isym, n, iunit
+    integer, dimension(8) :: norbs, norbs_gel
+    integer :: ntot, ngel, nocc, nligo, nact, nligv, nvirt, ndel, nirrep
+
+    real*8, dimension(:), allocatable :: ijkl
+
+    integer :: nsp, nsq, nsr, nss, nt, nu, nv, nx
+    integer :: nbp, nbq, nbr, nbs
+    integer :: isftp, isftq, isftr, isfts
+    integer :: nspq, nssm, nspqr, norbp, ntm, nxm
+    integer :: iout, ierr
+    integer :: numax, numin
+    integer :: n_dispatch
+
+    character(len=1024) :: filename
+    character(len=1024) :: format_string
+
+    
+    !Initialisation
+    ntot = o_info%ntot
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ndel = o_info%ndel
+
+    nirrep = g_info%nirrep
+    
+    norbs(1:8) = 0
+    norbs_gel(1:8) = 0
+    do isym = 1,nirrep
+       norbs_gel(isym) = o_info%nOrb(isym,0)
+       norbs(isym) =  o_info%nOrb(isym,1) + &
+            o_info%nOrb(isym,2) + o_info%nOrb(isym,3) + &
+            o_info%nOrb(isym,4) + o_info%nOrb(isym,5)
+    end do
+
+    !Open tmp int files
+    if (debugl) then
+       open(f_oooo, file="tmp.oooo")
+       open(f_aaaa, file="tmp.aaaa")
+       open(f_aaao, file="tmp.aaao")
+       open(f_aaoo, file="tmp.aaoo")
+       open(f_aoao, file="tmp.aoao")
+       open(f_aooo, file="tmp.aooo")
+       open(f_vooo, file="tmp.vooo")
+       open(f_vaoo, file="tmp.vaoo")
+       open(f_voao, file="tmp.voao")
+       open(f_vaao, file="tmp.vaao")
+       open(f_vaaa, file="tmp.vaaa")
+       open(f_vvao, file="tmp.vvao")
+       open(f_vvaa, file="tmp.vvaa")
+       open(f_vvoo, file="tmp.vvoo")
+       open(f_vovo, file="tmp.vovo")
+       open(f_vvva, file="tmp.vvva")
+       open(f_vvvo, file="tmp.vvvo")
+       open(f_vvvv, file="tmp.vvvv")
+       open(f_gel, file="tmp.gel")
+    endif   
+
+    do iunit = begunit, endunit
+       if (prog_info%id_cpu < 10) then
+            format_string = "(A9,A,I1)"
+        else
+            format_string = "(A9,A,I2)"
+         endif
+         write (filename,format_string) unitname(iunit),".",prog_info%id_cpu 
+       open(iunit, file=trim(filename), form='unformatted')
+       
+    enddo
+
+!!$-----
+!!$----- Lecture des Informations sur TraInt en 64 bits 
+!!$-----
+
+    ! Lire les pointeurs de TraInt
+    iDisk = 0
+    nTraToc = 106
+    nTraBuf = 9600
+    allocate(itoc8(nTraToc))
+       itoc8(:) = 0 
+    krc=c_lseek(cf_tint,iDisk)
+    krc=c_read(cf_tint,itoc8,nTraToc*8)
+    if (debugl)  call wrt_debug_itoc8(itoc8,nTraToc,0)
+    n = (nTraToc+7)/64
+    n = n*64
+    iDisk = iDisk + n*8
+    iAdrTwo  = itoc8(1)
+        
+    !-----
+    !----- TraOne Lecture des integrales bielectroniques
+    !-----
+
+    open(f_debug,file="debug",form="formatted")
+    
+    allocate(ijkl(nTraBuf))
+    iDisk = iAdrTwo*64*8
+    krc = c_lseek(cf_tint,iDisk)
+
+    ! (pq|rs)
+    nsp313:  do nsp = 1,nirrep                   ! irrep de p
+       nbp = norbs(nsp)         ! total nb of orb of irrep p
+       isftp = norbs_gel(nsp)
+       nsq312:  do nsq = 1,nsp                   ! irrep de q
+          nspq = its(nsp,nsq)                    ! irrep(pq) = irrep(p) x irrep(q)
+          nbq  = norbs(nsq)     ! total nb of orb of irrep q
+          isftq = norbs_gel(nsq)
+          nsr311:  do nsr = 1,nsp                ! irrep de r
+             nspqr = its(nspq,nsr)               ! irrep(pqr) = irrep(pq) x irrep(r)
+             nbr   = norbs(nsr) ! total nb of orb of irrep r
+             isftr = norbs_gel(nsr)
+             nssm  = nsr
+             if (nsr.eq.nsp) nssm = nsq
+             nss310:  do nss = 1,nssm   ! irrep de s
+                ! Test if irrep(s) = irrep(pqr)
+                ! if not integrals are 0 by symmetry
+                if (nss.ne.nspqr) goto 310
+                nbs = norbs(nss)! total nb of orb of irrep s
+                isfts = norbs_gel(nss)
+                norbp = nbp*nbq*nbr*nbs
+                if (norbp.eq.0) goto 310
+                krc = c_read(cf_tint,ijkl,nTraBuf*8)
+                !write(*,*) ijkl
+                iout = 0
+                nv309: do  nv=isftr+1,isftr+nbr ! orb de irrep r
+                   nxm = nbs
+                   if (nsr.eq.nss) nxm = nv
+                   nx308: do  nx=isfts+1,nxm  ! orb de irrep de s
+                      ntm = 1+isftp
+                      if (nsp.eq.nsr) ntm = nv
+                      nt307:  do  nt = ntm,isftp+nbp ! orb de irrep de p
+                         numin = 1+isftq
+                         if (nsp.eq.nsr.and.nt.eq.nv) numin = nx
+                         numax = nbq
+                         if (nsp.eq.nsq) numax = nt
+                         nu306: do nu = numin,numax  ! orb de irrep de q
+                            iout = iout+1
+                            if (iout.gt.nTraBuf) then
+                               krc = c_read(cf_tint,ijkl,nTraBuf*8)
+                               iout = 1
+                            end if
+                            call dispatch_int(ijkl(iout),nsp,nsq,nsr,nss,&
+                                 nt,nu,nv,nx,o_info,ord_info,int_info,debugl)
+
+                         end do nu306
+307                      continue
+                      end do nt307
+308                   continue
+                   end do nx308
+309                continue
+                end do nv309
+310             continue
+             end do nss310
+311          continue
+          end do nsr311
+312       continue
+       end do nsq312
+313    continue
+    end do nsp313
+
+    if (prog_info%id_cpu.eq.0) then
+       call write_ntwoint(f_output, int_info)
+    endif
+       
+    n_dispatch = int_info%n_oooo + int_info%n_aooo + int_info%n_aaoo &
+         + int_info%n_aaao + int_info%n_aaaa + int_info%n_vooo &
+         + int_info%n_vaoo + int_info%n_vaao + int_info%n_vaaa &
+         + int_info%n_vvoo + int_info%n_vvao + int_info%n_vvaa &
+         + int_info%n_vvvo + int_info%n_vvva + int_info%n_vvvv &
+         + int_info%n_aoao + int_info%n_voao + int_info%n_vovo &
+         + int_info%n_gint + int_info%n_vava & !+ int_info%n_aoaa &
+         + int_info%n_voaa + int_info%n_vavo !+ int_info%n_vova
+
+    
+    if (n_dispatch .ne. int_info%n_2int) then
+       call SASS_quit("Missing 2e- integrals", f_output)
+    endif
+    
+    !Cleanup
+    deallocate(ijkl)
+    deallocate(itoc8)
+
+    if (debugl) then
+       close(f_oooo)
+       close(f_aaaa)
+       close(f_aaao)
+       close(f_aaoo)
+       close(f_aoao)
+       close(f_aooo)
+       close(f_vooo)
+       close(f_vaoo)
+       close(f_voao)
+       close(f_vaao)
+       close(f_vaaa)
+       close(f_vvao)
+       close(f_vvaa)
+       close(f_vvoo)
+       close(f_vovo)
+       close(f_vvva)
+       close(f_vvvo)
+       close(f_vvvv)
+       close(f_gel)
+    endif
+
+
+    do iunit = begunit, endunit
+       close(iunit)
+    enddo
+
+    
+    
+  end subroutine read_traint_64
+
+  !$====================================================================
+  !> @brief Sort the 2e- integrals by type and write them in tmp file
+  !> @author ER
+  !> @date April 2018
+  !$====================================================================  
+  subroutine dispatch_int(ijkl,nsp,nsq,nsr,nss,&
+       nt,nu,nv,nx,o_info,ord_info,int_info,debugl)
+
+    real*8, intent(in)                :: ijkl
+    integer, intent(in)               :: nsp,nsq,nsr,nss
+    integer, intent(in)               :: nt,nu,nv,nx
+    type(o_infotype), intent(in)      :: o_info
+    type(ord_infotype), intent(in)    :: ord_info
+    type(int_infotype), intent(inout) :: int_info
+    logical, intent(in)               :: debugl
+
+    integer :: ntot, ngel, nocc, nligo, nact, nligv, nvirt, ndel
+
+    integer :: m1, m2, m3, m4
+    integer :: n1, n2, n3, n4
+    integer :: ni, nj, nk, nl
+    real*8  :: fini
+
+    !Initialisation
+    ntot = o_info%ntot
+    ngel = o_info%ngel
+    nocc = o_info%nocc
+    nligo = o_info%nligo
+    nact = o_info%nact
+    nligv = o_info%nligv
+    nvirt = o_info%nvirt
+    ndel = o_info%ndel
+
+    !write(f_debug,'(4i4,f16.12)') nt,nu,nv,nx
+    
+    m1 = ord_info%ord(nt,nsp) !iord(istart(NSP)+NT)
+    m2 = ord_info%ord(nu,nsq) !iord(istart(NSQ)+NU)
+    m3 = ord_info%ord(nv,nsr) !iord(istart(NSR)+NV)
+    m4 = ord_info%ord(nx,nss) !iord(istart(NSS)+NX)
+    !if (M1.eq.0 .or. M2.eq.0) goto 306
+    !if (M3.eq.0 .or. M4.eq.0) goto 306
+    ! order these indices canonically
+    N1 = M1
+    N2 = M2
+    if (M1.GT.M2) GOTO 511
+    N1 = M2
+    N2 = M1
+511 N3 = M3
+    N4 = M4
+    if (M3.gt.M4) goto 512
+    N3 = M4
+    N4 = M3
+512 NI = N1
+    NJ = N2
+    NK = N3
+    NL = N4
+    if (NI.gt.NK) goto 502
+    if (NI.EQ.NK) goto 514
+    NI = N3
+    NJ = N4
+    NK = N1
+    NL = N2
+    GOTO 502
+514 if (NJ.GT.NL) goto 502
+    NL = N2
+    NJ = N4
+502 fini = ijkl
+    int_info%n_2int = int_info%n_2int +1
+    
+    case_ni: if (ni.le.ngel) then !GGGG
+       int_info%n_gint = int_info%n_gint +1
+    else if (ni.le.ngel+nocc+nligo) then
+       !O
+       if (nj.le.ngel) then !OG
+          if (nk.le.ngel) then !OGGG
+             int_info%n_gint = int_info%n_gint +1
+          else !OGO
+             if (nl.le.ngel) then !OGOG
+                int_info%n_gint = int_info%n_gint +1
+             else !OGOO
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          endif
+       else !OO
+          if (nk.le.ngel) then !OOGG
+             int_info%n_gint = int_info%n_gint +1
+          else !OOO
+             if (nl.le.ngel) then !OOOG
+                int_info%n_gint = int_info%n_gint +1
+             else !OOOO
+                if (debugl) write(f_oooo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_oooo) ni,nj,nk,nl,fini
+                int_info%n_oooo = int_info%n_oooo +1
+             endif
+          endif
+       endif
+    else if (ni.le.ngel+nocc+nligo+nact) then !A
+       case_anj: if (nj .le. ngel) then !AG
+          if (nk .le. ngel) then !AGGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk .le. ngel+nocc+nligo) then !AGO
+             if (nl .le. ngel) then !AGOG
+                int_info%n_gint = int_info%n_gint +1
+             else !AGOO
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          else !AGA
+             if (nl .le. ngel) then !AGAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl.le.ngel+nocc+nligo) then !AGAO
+                int_info%n_gint = int_info%n_gint +1
+             else !AGAA
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          endif
+       else if (nj .le. ngel+nocc+nligo) then !AO
+          if (nk .le. ngel) then !AOGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk .le. ngel+nocc+nligo) then !AOO
+             if (nl .le. ngel) then !AOOG
+                int_info%n_gint = int_info%n_gint +1
+             else !AOOO
+                if (debugl) write(f_aooo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_aooo) ni,nj,nk,nl,fini
+                int_info%n_aooo = int_info%n_aooo +1
+             endif
+          else !AOA
+             if (nl .le. ngel) then !AOAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !AOAO
+                if (debugl) write(f_aoao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_aoao) ni,nj,nk,nl,fini
+                int_info%n_aoao = int_info%n_aoao +1
+             else !AOAA stored as AAOA
+                write(uf_aaao) nk,nl,ni,nj,fini
+                if (debugl) write(f_aaao,'(4i4,f16.12)') nk,nl,ni,nj,fini
+                int_info%n_aaao = int_info%n_aaao +1
+             endif
+          endif
+       else !AA
+          if (nk .le. ngel) then !AAGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk .le. ngel+nocc+nligo) then !AAO
+             if (nl .le. ngel) then !AAOG
+                int_info%n_gint = int_info%n_gint +1
+             else !AAOO
+                if (debugl) write(f_aaoo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_aaoo) ni,nj,nk,nl,fini
+                int_info%n_aaoo = int_info%n_aaoo +1
+             endif
+          else !AAA
+             if (nl .le. ngel) then !AAAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !AAAO
+                if (debugl) write(f_aaao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_aaao) ni,nj,nk,nl,fini
+                int_info%n_aaao = int_info%n_aaao +1
+             else !AAAA
+                if (debugl) write(f_aaaa,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_aaaa) ni,nj,nk,nl,fini
+                int_info%n_aaaa = int_info%n_aaaa +1
+             endif
+          endif
+       endif case_anj
+    else if (ni .le. ngel+nocc+nligo+nact+nligv+nvirt) then !V
+       case_vnj:  if (nj .le. ngel) then !VG
+          if (nk .le. ngel) then !VGGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk.le.ngel+nocc+nligo) then !VGO
+             if (nl.le.ngel) then !VGOG
+                int_info%n_gint = int_info%n_gint +1
+             else !VGOO
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          else if (nk.le.ngel+nocc+nligo+nact) then !VGA
+             if (nl.le.ngel) then !VGAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl.le.ngel+nocc+nligo) then !VGAO
+                int_info%n_gint = int_info%n_gint +1
+             else !VGAA
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          else if (nk.le.ngel+nocc+nligo+nact+nligv+nvirt) then !VGV
+             if (nl.le.ngel) then !VGVG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl.le.ngel+nocc+nligo) then !VGVO
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl.le.ngel+nocc+nligo+nact) then !VGVA
+                int_info%n_gint = int_info%n_gint +1
+             else !VGVV
+                int_info%n_gint = int_info%n_gint +1
+             endif
+          endif
+       else if (nj .le. ngel+nocc+nligo) then !VO
+          if (nk .le. ngel) then !VOGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk .le. ngel+nocc+nligo) then !VOO
+             if (nl .le. ngel) then !VOOG
+                int_info%n_gint = int_info%n_gint +1
+             else !VOOO
+                if (debugl) write(f_vooo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_vooo) ni,nj,nk,nl,fini
+                int_info%n_vooo = int_info%n_vooo +1
+             endif
+          else if (nk .le. ngel+nocc+nligo+nact) then !VOA
+             if (nl .le. ngel) then !VOAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VOAO
+                if (debugl) write(f_voao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_voao) ni,nj,nk,nl,fini
+                int_info%n_voao = int_info%n_voao +1
+             else !VOAA
+                write(uf_voaa) ni,nj,nk,nl,fini
+                if (debugl) write(f_vaao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_voaa = int_info%n_voaa +1
+             endif
+          else !VOV
+             if (nl .le. ngel) then !VOVG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VOVO
+                if (debugl) write(f_vovo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_vovo) ni,nj,nk,nl,fini
+                int_info%n_vovo = int_info%n_vovo +1
+             else if (nl .le. ngel+nocc+nligo+nact) then !VOVA stored as VAVO
+                if (debugl) write(f_vvao,'(4i4,f16.12)') nk,nl,ni,nj,fini
+                write(uf_vavo) nk,nl,ni,nj,fini
+                int_info%n_vavo = int_info%n_vavo +1
+             else !VOVV stored as VVVO
+                write(uf_vvvo) nk,nl,ni,nj,fini
+                if (debugl) write(f_vvvo,'(4i4,f16.12)') nk,nl,ni,nj,fini
+                int_info%n_vvvo = int_info%n_vvvo +1
+             endif
+          endif
+       else if (nj .le. ngel+nocc+nligo+nact) then !VA
+          if (nk.le.ngel) then !VAGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk.le.ngel+nocc+nligo) then !VAO
+             if (nl.le.ngel) then !VAOG
+                int_info%n_gint = int_info%n_gint +1
+             else !VAOO
+                if (debugl) write(f_vaoo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_vaoo) ni,nj,nk,nl,fini
+                int_info%n_vaoo = int_info%n_vaoo +1
+             endif
+          else if (nk.le.ngel+nocc+nligo+nact) then !VAA
+             if (nl .le. ngel) then !VAAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VAAO
+                if (debugl) write(f_vaao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vaao = int_info%n_vaao +1
+                write(uf_vaao) ni,nj,nk,nl,fini
+             else !VAAA
+                if (debugl) write(f_vaaa,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vaaa = int_info%n_vaaa +1
+                write(uf_vaaa) ni,nj,nk,nl,fini
+             endif
+          else if (nk.le.ngel+nocc+nligo+nact+nligv+nvirt) then !VAV
+             if (nl .le. ngel) then !VAVG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VAVO
+                if (debugl) write(f_vvao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vavo = int_info%n_vavo +1
+                write(uf_vavo) ni,nj,nk,nl,fini
+             else if (nl.le.ngel+nocc+nligo+nact) then !VAVA
+                if (debugl) write(f_vvaa,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vava = int_info%n_vava +1
+                write(uf_vava) ni,nj,nk,nl,fini
+             else !VAVV stored as VVVA
+                if (debugl) write(f_vvva,'(4i4,f16.12)') nk,nl,ni,nj,fini
+                int_info%n_vvva = int_info%n_vvva +1
+                write(uf_vvva) nk,nl,ni,nj,fini
+             endif
+          else
+             call SASS_quit("Problem with TraInt reading nk < virt",f_output)
+          endif
+       else if (nj .le. ngel+nocc+nligo+nact+nligv+nvirt) then !VV
+          if (nk.le.ngel) then !VVGG
+             int_info%n_gint = int_info%n_gint +1
+          else if (nk.le.ngel+nocc+nligo) then !VVO
+             if (nl.le.ngel) then !VVOG
+                int_info%n_gint = int_info%n_gint +1
+             else !VVOO
+                if (debugl) write(f_vvoo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                write(uf_vvoo) ni,nj,nk,nl,fini
+                int_info%n_vvoo = int_info%n_vvoo +1
+             endif
+          else if (nk.le.ngel+nocc+nligo+nact) then !VVA
+             if (nl.le.ngel) then !VVAG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VVAO
+                if (debugl) write(f_vvao,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vvao = int_info%n_vvao +1
+                write(uf_vvao) ni,nj,nk,nl,fini
+             else if (nl.le.ngel+nocc+nligo+nact) then !VVAA
+                if (debugl) write(f_vvaa,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vvaa = int_info%n_vvaa +1
+                write(uf_vvaa) ni,nj,nk,nl,fini
+             endif
+          else !VVV
+             if (nl.le.ngel) then !VVVG
+                int_info%n_gint = int_info%n_gint +1
+             else if (nl .le. ngel+nocc+nligo) then !VVVO
+                if (debugl) write(f_vvvo,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vvvo = int_info%n_vvvo +1
+                write(uf_vvvo) ni,nj,nk,nl,fini
+             else if (nl.le.ngel+nocc+nligo+nact) then !VVVA
+                if (debugl) write(f_vvva,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vvva = int_info%n_vvva +1
+                write(uf_vvva) ni,nj,nk,nl,fini
+             else if (nl.le.ngel+nocc+nligo+nact+nligv+nvirt) then !VVVV
+                if (debugl) write(f_vvvv,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                int_info%n_vvvv = int_info%n_vvvv +1
+                 write(uf_vvvv) ni,nj,nk,nl,fini
+             else
+                write(*,'(4i4,f16.12)') ni,nj,nk,nl,fini
+                call SASS_quit("Problem with TraInt reading nl < virt",f_output)
+             endif
+          endif
+       else
+          write(*,'(4i4,f16.12)') ni,nj,nk,nl,fini
+          call SASS_quit("Problem with TraInt reading nj < virt",f_output)
+       endif case_vnj
+    else
+       write(*,'(4i4,f16.12)') ni,nj,nk,nl,fini
+       call SASS_quit("Problem with TraInt reading",f_output)
+    endif case_ni
+
+  end subroutine dispatch_int
+
+  
+!!$============================================================
+!!$============================================================
+!!$============================================================
+  subroutine wrt_debug_itoc(itoc,nitoc,iad)
+    use files
+    Implicit none
+    Integer :: nitoc
+    Integer, dimension(nitoc) :: itoc
+    integer :: iad,i,n
+    write(f_output, *) '  Debug: En',iad,' itoc ='
+    do n=1,8
+       write(f_output, '(8(2x,i8))') (itoc(i),i=(n-1)*8+1,n*8)
+    end do
+  end subroutine wrt_debug_itoc
+!!$============================================================
+!!$============================================================
+!!$============================================================
+  subroutine wrt_debug_itoc8(itoc8,nitoc,iad)
+    use files
+    Implicit none
+    Integer*8, dimension(nitoc) :: itoc8
+    integer :: iad, nitoc,i,n
+    write(f_output, *) '  Debug: En',iad,' itoc ='
+    do n=1,8
+       write(f_output, '(8(2x,i8))') (itoc8(i),i=(n-1)*8+1,n*8)
+    end do
+  end subroutine wrt_debug_itoc8
+!!$============================================================
+!!$============================================================
+!!$============================================================
+  subroutine wrt_debug_ctoc(ctoc,nitoc,iad)
+    use files
+    Implicit none
+    Character*5, dimension(nitoc) :: ctoc
+    integer :: iad, nitoc,i,n, nn
+    write(f_output, *) '  Debug: En',iad,' ctoc ='
+    nn = nitoc/8
+    do n=1,nn
+       write(f_output, '(8(2("-"),a4,":",a4))') (ctoc(i),i=(n-1)*8+1,n*8)
+    end do
+    write(f_output, '(8(2("-"),a4,":",a4))') (ctoc(i),i=nn*8+1,nitoc)
+
+  end subroutine wrt_debug_ctoc
+!!$============================================================
+!!$============================================================
+!!$============================================================
+  subroutine wrt_debug_rtoc(rtoc,ntoc,iad)
+    use files
+    Implicit none
+    Real*8, dimension(ntoc) :: rtoc
+    integer :: iad, ntoc,i,n, nn
+    write(f_output, *) '  Debug: En',iad,' rtoc ='
+    nn = ntoc/8
+    do n=1,nn
+       write(f_output, '(8(2x,D15.6))') (rtoc(i),i=(n-1)*8+1,n*8)
+    end do
+    write(f_output, '(8(2x,D15.6))') (rtoc(i),i=nn*8+1,ntoc)
+
+  end subroutine wrt_debug_rtoc
+
+  
+!!$============================================================
+!!$============================================================
+!!$============================================================
+  subroutine lect_Mono(prog_info)
+!!$------------------------------------------------------------
+!!$ Lecture des integrales sur ijcl après molcost
+!!$ pas fini
+!!$
+!!$ OneInt     : (i,j) integrales monoelectroniques 
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+    use info
+    use utils_char
+    use files
+!!$ -------- Donnes locales -----------------------------------
+    Implicit none
+
+    type(prog_infotype), intent(in) :: prog_info
+    
+    Logical :: debugl=.true.
+
+    Real*8 :: potnuc
+    Integer, dimension(8) :: norbsym
+    Integer :: nsym
+    real*8, dimension(:), allocatable :: hmono, S
+
+    character*24 :: label
+    character*80 :: aa
+    Integer :: len, n, i, k, ibid, nn, is
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+
+!!$-----
+!!$----- TraOne preparation
+!!$-----
+    ! Ouverture du fichier
+    if (prog_info%Yprefix) then
+       ! call lowercase(prog_info%prefix)
+       call noblancs(prog_info%prefix,n)
+       open(f_Mono,file=prog_info%prefix(1:n)//".Mono",form="unformatted",&
+            status='unknown')
+       write(f_output,*) "  Ouverture Mono = ",prog_info%prefix(1:n)//".Mono"
+    else
+       open(f_Mono,file="Mono",form="unformatted",status='unknown')
+       write(f_output,*) "  Ouverture Mono = ","Mono"
+    end if
+
+
+    ! Lecture matrice de recouvrement
+    label = '==OVERLAP MATRIX (SYM)'
+    i = 0
+    do 
+       read (f_Mono,err=10,end=999) aa
+       write (f_output,*) aa
+       i = i+1
+       if (trim(aa).eq.label) then
+          write (f_output,*) " J'ai trouve ",aa
+          ! lire longueur, nbre irrep, nbre orb par irrep
+          read(f_Mono) len, nsym, (norbsym(k),k=1,nsym) 
+          write (f_output,*) "  Longueur =",len
+          write (f_output,*) "  nsym     =",nsym
+          i = i+1
+          allocate (S(len))
+          ! lire oneint
+          read(f_Mono) S(1:len)
+          i = i+1 
+          if (debugl) then
+             open(f_debug, file="debug", form="formatted")
+             write(f_debug,*) label
+             do k=1,len
+                write(f_debug,*) S(k)
+             end do
+          end if
+          exit
+       end if
+10     continue
+    end do
+    write (f_output,*) i
+    deallocate(S)
+
+    ! Lecture matrice de recouvrement
+    label = '==OVERLAP MATRIX (TOTAL)'
+    do 
+       read (f_Mono,err=20,end=999) aa
+       write (f_output,*) trim(aa)
+       i = i+1
+       if (trim(aa).eq.label) then
+          write (f_output,*) " J'ai trouve ",aa
+          ! lire longueur, nbre irrep, nbre orb par irrep
+          read(f_Mono) len, nsym, (norbsym(k),k=1,nsym) 
+          write (f_output,*) "  Longueur =",len
+          write (f_output,*) "  nsym     =",nsym
+          i = i+1
+          allocate (S(len))
+          ! lire oneint
+          read(f_Mono) S(1:len)
+          i = i+1 
+          if (debugl) then
+             write(f_debug,*) label
+             do k=1,len
+                write(f_debug,*) S(k)
+             end do
+          end if
+          exit
+       end if
+20     continue
+    end do
+    write (f_output,*) i
+    deallocate(S)
+
+
+    ! trouver '==ONEINT MATRIX (TOTAL)'
+    label =  '==ONEINT MATRIX (TOTAL)'
+    do 
+       read (f_Mono,end=999) aa
+       write (f_output,*) aa
+       if (trim(aa).eq.label) then
+          write (f_output,*) " J'ai trouve ",aa
+          ! lire longueur, nbre irrep, nbre orb par irrep
+          read(f_Mono) len, nsym, (norbsym(k),k=1,nsym) 
+          allocate (hmono(len))
+          ! lire oneint
+          read(f_Mono) hmono(1:len)
+          if (debugl) then
+             open(f_debug, file="debug", form="formatted")
+             do k=1,len
+                write(f_debug,*) hmono(k)
+             end do
+          end if
+          exit
+       end if
+    end do
+999 write(f_output,*) " Fin Mono", i
+
+    close(f_Mono)
+  end subroutine lect_Mono
+
+  
+    
+end module integrales
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/molcastype.h b/src/molcastype.h
new file mode 100644
index 0000000000000000000000000000000000000000..539212dcc8544b2f38bd46f10f3959976f4d6c8c
--- /dev/null
+++ b/src/molcastype.h
@@ -0,0 +1,37 @@
+/***********************************************************************
+* This file is part of OpenMolcas.                                     *
+*                                                                      *
+* OpenMolcas is free software; you can redistribute it and/or modify   *
+* it under the terms of the GNU Lesser General Public License, v. 2.1. *
+* OpenMolcas is distributed in the hope that it will be useful, but it *
+* is provided "as is" and without any express or implied warranties.   *
+* For more details see the full text of the license in the file        *
+* LICENSE or in <http://www.gnu.org/licenses/>.                        *
+***********************************************************************/
+/*
+ *
+ * header file for int definition
+ *
+ */
+
+#ifndef _MOLCAS_TYPE_H_
+#define _MOLCAS_TYPE_H_
+
+#ifdef _I8_
+#ifdef _x86_I8_           /* ---- x86 I8  ---- */
+#define INT long long int
+#define UN_INT unsigned long long int
+#define INT_FORMAT "%lld"
+#else
+#define INT long int      /* ----   I8   ----- */
+#define UN_INT unsigned long int
+#define INT_FORMAT "%ld"
+#endif
+#else
+#define INT int           /* ----   I4   ----- */
+#define UN_INT unsigned int
+#define INT_FORMAT "%d"
+#endif
+#define LIFMT(X) (long int) (X)
+
+#endif
diff --git a/src/mpi_blockpair.F90 b/src/mpi_blockpair.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6e49233cbe98b4f946da73c3098b8ff058862da4
--- /dev/null
+++ b/src/mpi_blockpair.F90
@@ -0,0 +1,2750 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+!This code was generated by hvblock.x: DO NOT EDIT !
+ subroutine int_blockpair_list_batch(list)
+
+ use utils_batch
+ use info
+
+ type(int_blockpair_list) :: list
+ integer                  :: i
+
+ call int_blockpair_list_init(list,         284 )
+
+ do i = 1, list%nint_blockpair
+ select case(i)
+case(1)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(2)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(3)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(4)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(5)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(6)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(7)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(8)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(9)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(10)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(11)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(12)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(13)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(14)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(15)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(16)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(17)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(18)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(19)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(20)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(21)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(22)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(23)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(24)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(25)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(26)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(27)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(28)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(29)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(30)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(31)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(32)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(33)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(34)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(35)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(36)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(37)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(38)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(39)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(40)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(41)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(42)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(43)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(44)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(45)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(46)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(47)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(48)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(49)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(50)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(51)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(52)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(53)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(54)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(55)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(56)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(57)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(58)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(59)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(60)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(61)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(62)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(63)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(64)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(65)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(66)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(67)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(68)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(69)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(70)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(71)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(72)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(73)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(74)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(75)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(76)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(77)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(78)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(79)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(80)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(81)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(82)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(83)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(84)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(85)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(86)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(87)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(88)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(89)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(90)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(91)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(92)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(93)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(94)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(95)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(96)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(97)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(98)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(99)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(100)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(101)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(102)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(103)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(104)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(105)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(106)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(107)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(108)
+  list%l(i)%intkind ='vaaa'
+  list%l(i)%indxIntkind = 4
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(109)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(110)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(111)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(112)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(113)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(114)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(115)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(116)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(117)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(118)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(119)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(120)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(121)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(122)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(123)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(124)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(125)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(126)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(127)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(128)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(129)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(130)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(131)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(132)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(133)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(134)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(135)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(136)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(137)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(138)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(139)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(140)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(141)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(142)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(143)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(144)
+  list%l(i)%intkind ='vaao'
+  list%l(i)%indxIntkind = 6
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(145)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(146)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(147)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(148)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(149)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(150)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(151)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(152)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(153)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(154)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(155)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(156)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(157)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(158)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(159)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(160)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(161)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(162)
+  list%l(i)%intkind ='vvaa'
+  list%l(i)%indxIntkind = 7
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(163)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(164)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(165)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(166)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(167)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(168)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(169)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(170)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(171)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(172)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(173)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(174)
+  list%l(i)%intkind ='vaoo'
+  list%l(i)%indxIntkind = 8
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(175)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(176)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(177)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(178)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(179)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(180)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(181)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(182)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(183)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(184)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(185)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(186)
+  list%l(i)%intkind ='vvao'
+  list%l(i)%indxIntkind = 9
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(187)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(188)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 2
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(189)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(190)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(191)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(192)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(193)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(194)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(195)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(196)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(197)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(198)
+  list%l(i)%intkind ='vvoo'
+  list%l(i)%indxIntkind = 10
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(199)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(200)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(201)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(202)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(203)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(204)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(205)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(206)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(207)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(208)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(209)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(210)
+  list%l(i)%intkind ='vava'
+  list%l(i)%indxIntkind = 11
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(211)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(212)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(213)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(214)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(215)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(216)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(217)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(218)
+  list%l(i)%intkind ='vvvo'
+  list%l(i)%indxIntkind = 12
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(219)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(220)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(221)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(222)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(223)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(224)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(225)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(226)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(227)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(228)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(229)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(230)
+  list%l(i)%intkind ='vvva'
+  list%l(i)%indxIntkind = 13
+  list%l(i)%indxI = 6
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(231)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(232)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(233)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(234)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(235)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(236)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(237)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(238)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 7
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(239)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(240)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(241)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(242)
+  list%l(i)%intkind ='vvvv'
+  list%l(i)%indxIntkind = 14
+  list%l(i)%indxI = 9
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(243)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(244)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(245)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(246)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(247)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(248)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(249)
+  list%l(i)%intkind ='vovo'
+  list%l(i)%indxIntkind = 16
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(250)
+  list%l(i)%intkind ='vovo'
+  list%l(i)%indxIntkind = 16
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(251)
+  list%l(i)%intkind ='vovo'
+  list%l(i)%indxIntkind = 16
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(252)
+  list%l(i)%intkind ='vovo'
+  list%l(i)%indxIntkind = 16
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(253)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(254)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(255)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(256)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(257)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(258)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(259)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(260)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(261)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(262)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 7
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(263)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(264)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(265)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(266)
+  list%l(i)%intkind ='vavo'
+  list%l(i)%indxIntkind = 18
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(267)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(268)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(269)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(270)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 2
+  list%l(i)%indxJ = 3
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(271)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(272)
+  list%l(i)%intkind ='vooo'
+  list%l(i)%indxIntkind = 19
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(273)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(274)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(275)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(276)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 9
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(277)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(278)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 5
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(279)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(280)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 5
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(281)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(282)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 2
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(283)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 3
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(284)
+  list%l(i)%intkind ='voao'
+  list%l(i)%indxIntkind = 21
+  list%l(i)%indxI = 3
+  list%l(i)%indxJ = 6
+  list%l(i)%spincase = 4
+  list%l(i)%batch = .true.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+ end select
+ end do
+ end subroutine int_blockpair_list_batch
+ subroutine int_blockpair_list_unbatch(list)
+
+ use utils_batch
+ use info
+
+ type(int_blockpair_list) :: list
+ integer                  :: i
+
+ call int_blockpair_list_init(list,          15 )
+
+ do i = 1, list%nint_blockpair
+ select case(i)
+case(1)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 1
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(2)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(3)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(4)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(5)
+  list%l(i)%intkind ='fock'
+  list%l(i)%indxIntkind = 1
+  list%l(i)%indxI = 8
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(6)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 1
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(7)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(8)
+  list%l(i)%intkind ='aaaa'
+  list%l(i)%indxIntkind = 2
+  list%l(i)%indxI = 8
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(9)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(10)
+  list%l(i)%intkind ='aaao'
+  list%l(i)%indxIntkind = 3
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(11)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 4
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(12)
+  list%l(i)%intkind ='aaoo'
+  list%l(i)%indxIntkind = 5
+  list%l(i)%indxI = 8
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(13)
+  list%l(i)%intkind ='oooo'
+  list%l(i)%indxIntkind = 15
+  list%l(i)%indxI = 8
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(14)
+  list%l(i)%intkind ='aooo'
+  list%l(i)%indxIntkind = 17
+  list%l(i)%indxI = 4
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+case(15)
+  list%l(i)%intkind ='aoao'
+  list%l(i)%indxIntkind = 20
+  list%l(i)%indxI = 1
+  list%l(i)%indxJ = 8
+  list%l(i)%spincase = 1
+  list%l(i)%batch = .false.
+  list%l(i)%pmin = 0
+  list%l(i)%pmax = 0
+ end select
+ end do
+ end subroutine int_blockpair_list_unbatch
diff --git a/src/orb_ordering.F90 b/src/orb_ordering.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3b0fea529609e7306e8a5eeaab787908f260944f
--- /dev/null
+++ b/src/orb_ordering.F90
@@ -0,0 +1,259 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+
+Subroutine orb_ordering(prog_info, ord_info, o_info, g_info)
+!!$------------------------------------------------------------
+!!$ Création des tableau d'indices pour transformer les 
+!!$   numerotations des orbitales molcas <-> SASS
+!!$ ord(iorb,irrep)  : numero d'ordre de l'orbitale ds sass 
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ orda(iorb,irrep) : numero d'ordre de la spin-orbitale alpha ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordb(iorb,irrep) : numero d'ordre de la spin-orbitale beta ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordinva(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    alpha (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$ ordinvb(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    beta (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+  use info
+  use dimensions
+
+  implicit none
+
+  type(prog_infotype), intent(in) :: prog_info
+  type(o_infotype), intent(in)    :: o_info
+  type(g_infotype), intent(in)    :: g_info
+  type(ord_infotype), intent(out) :: ord_info
+
+!!$ -------- Donnes locales -----------------------------------         
+  Integer, dimension(IRREP_MAX) :: norb_irrep
+  Integer :: irrep, iorb
+  Integer :: i, l0, la, lb, ndeb, isft, nn, nbid, n, k, j, nirrep
+  Integer :: oshift
+  Character*12, dimension(0:6) :: mess
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+
+  !write(*,*) 'orb_ordering id_cpu', prog_info%id_cpu
+  
+  mess(0) = "   Gelees = "
+  mess(1) = "   Occ    = "
+  mess(2) = "   Ligo   = "
+  mess(3) = "   Act    = "
+  mess(4) = "   Ligv   = "
+  mess(5) = "   Virt   = "
+  mess(6) = "   Delete = "
+
+!!$
+!!$  De molcas vers SASS
+!!$         
+  norb_irrep(:) = 0
+  norb_irrep =  sum(o_info%norb, dim=2)
+  nn = maxval(norb_irrep)
+  nirrep = g_info%nirrep
+
+  allocate(ord_info%ord(nn,nirrep))
+  allocate(ord_info%orda(nn,nirrep))
+  allocate(ord_info%ordb(nn,nirrep))
+  
+  ord_info%ord(:,:) = 0
+  ord_info%orda(:,:) = 0
+  ord_info%ordb(:,:) = 0
+
+  do irrep = 1, nirrep
+     !Frozen orbitals
+     l0 = 0 !Shift for spatial orbital ordering ord
+     la = 0 !Shift for alpha spin-orbital ordering orda
+     lb = o_info%ngel ! Shift for beta spin-orbital ordering ordb
+     isft = 0
+     isft = sum(o_info%norb_gel(1:irrep-1)) !Shift due to the irrep number
+     ndeb = 0
+     do iorb = 1+ndeb, o_info%norb_gel(irrep)+ndeb
+        ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+        ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+        ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+        !> @TODO Irrep number as well ?
+     end do
+
+     !Occ, ligo orbitals
+     !For each irrep : occ alpha, ligo alpha are treated together
+     ndeb = o_info%norb_gel(irrep) 
+     l0 = l0 +   o_info%ngel
+     la = la + 2*o_info%ngel
+     nbid = sum(o_info%norb(1:nirrep,1)) + sum(o_info%norb(1:nirrep,2))
+     lb = la + nbid
+
+     !Shift from the occ and ligo from the previous irrep :
+     !Ligo and occ to irrep-1 + occ(irrep) for the ligo
+     isft = 0         
+     do i=1,2
+        if (i.eq.1) then !Occ
+           isft = sum(o_info%norb(1:irrep-1,1)) + sum(o_info%norb(1:irrep-1,2)) 
+        else ! Ligo
+           isft = sum(o_info%norb(1:irrep,1)) + sum(o_info%norb(1:irrep-1,2)) 
+        endif
+        do iorb = 1+ndeb, o_info%norb(irrep,i)+ndeb
+           ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0     
+           ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+           ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+           !> @TODO Irrep number as well ?
+           !ord_info%ordinva((iorb-ndeb) + isft + la,i) = iorb
+           !ord_info%ordinvb((iorb-ndeb) + isft + lb,i) = iorb
+        end do
+        ndeb = ndeb + o_info%norb(irrep,i)
+     end do
+
+     !Active orbitals
+     i=3
+     nbid = sum(o_info%norb(1:nirrep,1)) + sum(o_info%norb(1:nirrep,2))
+     l0 = l0 +   nbid
+     la = la + 2*nbid
+     lb = la + sum(o_info%norb(1:nirrep,i))
+     isft = sum(o_info%norb(1:irrep-1,i))
+     do iorb = 1+ndeb, o_info%norb(irrep,i)+ndeb
+        ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+        ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+        ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+        !> @TODO Irrep number as well ?
+        !ord_info%ordinva((iorb-ndeb) + isft + la,i) = iorb
+        !ord_info%ordinvb((iorb-ndeb) + isft + lb,i) = iorb
+     end do
+
+     ndeb = ndeb + o_info%norb(irrep,i)
+
+     nbid = sum(o_info%norb(1:nirrep,i))
+     l0 = l0 +   nbid
+     la = la + 2*nbid
+
+     nbid = sum(o_info%norb(1:nirrep,4)) + sum(o_info%norb(1:nirrep,5))
+     lb = la + nbid
+     !Ligv and virt orbitals
+     do i = 4,5
+        isft = 0
+        if (i.eq.4) then !Ligv 
+           isft = sum(o_info%norb(1:irrep-1,4)) + sum(o_info%norb(1:irrep-1,5))
+        else !Virt
+           isft = sum(o_info%norb(1:irrep,4)) + sum(o_info%norb(1:irrep-1,5))
+        endif
+        do iorb = 1+ndeb, o_info%norb(irrep,i)+ndeb
+           ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+           ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+           ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+           !> @TODO Irrep number as well ?
+           !ord_info%ordinva((iorb-ndeb) + isft + la,i) = iorb
+           !ord_info%ordinvb((iorb-ndeb) + isft + lb,i) = iorb
+        end do
+        ndeb = ndeb + o_info%norb(irrep,i)
+     end do
+     l0 = l0 +   nbid
+     la = la + 2*nbid
+     !Deleted orbitals
+     lb = la + o_info%ndel
+     isft = 0
+     isft = sum(o_info%norb_del(1:irrep-1))
+     do iorb = 1+ndeb, o_info%norb_del(irrep)+ndeb
+        ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+        ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+        ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+        !> @TODO Irrep number as well ?
+        !ord_info%ordinva((iorb-ndeb) + isft + la,i) = iorb
+        !ord_info%ordinvb((iorb-ndeb) + isft + lb,i) = iorb
+     end do
+  end do
+
+!!$
+!!$  Impressions f_ouput
+!!$
+  if (prog_info%id_cpu.eq.0) then
+  write(f_output,*) "  Ordre des orbitales MOLCAS ds SelS"
+  nn   = 0
+  do irrep = 1,nirrep
+     write(f_output,'("    Irrep = ",i2)') irrep
+     ndeb = 0
+     do i = 0,6
+        write(f_output,*) mess(i), o_info%norb(irrep,i)
+        n = o_info%norb(irrep,i)/10
+        j = 0
+        if (n.ne.0) then
+           do j = 1,n
+              write(f_output,9001) (iorb, iorb = (j-1)*10+1+ndeb+nn, j*10+ndeb+nn)
+              write(f_output,9004) (iorb, iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9005) &
+                   (ord_info%ord(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9002) &
+                   (ord_info%orda(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9003) &
+                   (ord_info%ordb(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,*) ''
+           end do
+        end if
+        k = o_info%norb(irrep,i) - n*10
+        if (k.ne.0) then 
+           write(f_output,9001) &
+                (iorb, iorb = n*10+1+ndeb+nn, o_info%norb(irrep,i)+ndeb+nn)
+           write(f_output,9004) &
+                (iorb, iorb = n*10+1+ndeb,  o_info%norb(irrep,i)+ndeb)
+           write(f_output,9005) &
+                (ord_info%ord(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+           write(f_output,9002) &
+                (ord_info%orda(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+           write(f_output,9003) &
+                (ord_info%ordb(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+        end if
+        ndeb = ndeb + o_info%norb(irrep,i)
+     end do
+     nn = nn + norb_irrep(irrep)
+     write(f_output,*)
+  end do
+  end if
+
+9001 format(6x," Molcas    : ", 10(2x,i5))
+9004 format(6x," Molcas/ir : ", 10(2x,i5))
+9002 format(6x," SelS up   : ", 10(2x,i5))
+9003 format(6x," SelS dn   : ", 10(2x,i5))
+9005 format(6x," SelS      : ", 10(2x,i5))
+
+
+end Subroutine orb_ordering
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/ordre.F90 b/src/ordre.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3d80609129eee51ad5107d6c49a8ca55cbf10414
--- /dev/null
+++ b/src/ordre.F90
@@ -0,0 +1,189 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+Subroutine ordre_orb(ord_info, o_info, g_info)
+!!$------------------------------------------------------------
+!!$ Création des tableau d'indices pour transformer les 
+!!$   numerotations des orbitales molcas <-> SASS
+!!$ ord(iorb,irrep)  : numero d'ordre de l'orbitale ds sass 
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ orda(iorb,irrep) : numero d'ordre de la spin-orbitale alpha ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordb(iorb,irrep) : numero d'ordre de la spin-orbitale beta ds sass
+!!$                    pour le ieme orbitale de l'irrep irrep dans molcas
+!!$ ordinva(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    alpha (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$ ordinvb(iorb,i)  : numero des orbitales dans molcas pour la spin-orbitale
+!!$                    beta (iorb,i) ds SASS 
+!!$                    i= 0=gel 1=occ  2=ligo  3=act  4=liv  5=virt  6=del
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+  use info
+  use dimensions
+
+  implicit none
+
+  type(o_infotype), intent(in)    :: o_info
+  type(g_infotype), intent(in)    :: g_info
+  type(ord_infotype), intent(out) :: ord_info
+
+!!$ -------- Donnes locales -----------------------------------         
+  Integer, dimension(IRREP_MAX) :: norb_irrep
+  Integer :: irrep, iorb
+  Integer :: i, l0, la, lb, ndeb, isft, nn, nbid, n, k, j, nirrep
+  Character*12, dimension(0:6) :: mess
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+  mess(0) = "   Gelees = "
+  mess(1) = "   Occ    = "
+  mess(2) = "   Ligo   = "
+  mess(3) = "   Act    = "
+  mess(4) = "   Ligv   = "
+  mess(5) = "   Virt   = "
+  mess(6) = "   Delete = "
+
+!!$
+!!$  De molcas vers SASS
+!!$         
+  norb_irrep(:) = 0
+  norb_irrep =  sum(o_info%norb, dim=2)
+  nn = maxval(norb_irrep)
+  nirrep = g_info%nirrep
+
+  allocate(ord_info%ord(nn,nirrep))
+  allocate(ord_info%orda(nn,nirrep))
+  allocate(ord_info%ordb(nn,nirrep))
+  ord_info%orda(:,:) = 0
+  ord_info%ordb(:,:) = 0
+
+  do irrep = 1, nirrep
+     l0 = 0
+     la = 0
+     lb = o_info%ngel
+     isft = 0
+     isft = sum(o_info%norb_gel(1:irrep-1))
+     ndeb = 0
+     do iorb = 1+ndeb, o_info%norb_gel(irrep)+ndeb
+        ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+        ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+        ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+     end do
+
+     ndeb = o_info%norb_gel(irrep)
+     l0 = l0 +   o_info%ngel
+     la = la + 2*o_info%ngel
+     do i = 1,5
+        nbid = sum(o_info%norb(1:nirrep,i))
+        lb = la + nbid
+        isft = 0
+        isft = sum(o_info%norb(1:irrep-1,i))
+        do iorb = 1+ndeb, o_info%norb(irrep,i)+ndeb
+           ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+           ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+           ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+        end do
+        ndeb = ndeb + o_info%norb(irrep,i)
+        l0 = l0 +   nbid
+        la = la + 2*nbid
+     end do
+
+     lb = la + o_info%ndel
+     isft = 0
+     isft = sum(o_info%norb_del(1:irrep-1))
+     do iorb = 1+ndeb, o_info%norb_del(irrep)+ndeb
+        ord_info%ord(iorb,irrep)  = (iorb-ndeb) + isft + l0
+        ord_info%orda(iorb,irrep) = (iorb-ndeb) + isft + la
+        ord_info%ordb(iorb,irrep) = (iorb-ndeb) + isft + lb
+     end do
+  end do
+
+!!$
+!!$  Impressions f_ouput
+!!$ 
+  write(f_output,*) "  Ordre des orbitales MOLCAS ds SelS"
+  nn   = 0
+  do irrep = 1,nirrep
+     write(f_output,'("    Irrep = ",i2)') irrep
+     ndeb = 0
+     do i = 0,6
+        write(f_output,*) mess(i), o_info%norb(irrep,i)
+        n = o_info%norb(irrep,i)/10
+        j = 0
+        if (n.ne.0) then
+           do j = 1,n
+              write(f_output,9001) (iorb, iorb = (j-1)*10+1+ndeb+nn, j*10+ndeb+nn)
+              write(f_output,9004) (iorb, iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9005) &
+                   (ord_info%ord(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9002) &
+                   (ord_info%orda(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,9003) &
+                   (ord_info%ordb(iorb,irrep), iorb = (j-1)*10+1+ndeb, j*10+ndeb)
+              write(f_output,*) ''
+           end do
+        end if
+        k = o_info%norb(irrep,i) - n*10
+        if (k.ne.0) then 
+           write(f_output,9001) &
+                (iorb, iorb = n*10+1+ndeb+nn, o_info%norb(irrep,i)+ndeb+nn)
+           write(f_output,9004) &
+                (iorb, iorb = n*10+1+ndeb,  o_info%norb(irrep,i)+ndeb)
+           write(f_output,9005) &
+                (ord_info%ord(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+           write(f_output,9002) &
+                (ord_info%orda(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+           write(f_output,9003) &
+                (ord_info%ordb(iorb,irrep), iorb = n*10+1+ndeb, &
+                o_info%norb(irrep,i)+ndeb)
+        end if
+        ndeb = ndeb + o_info%norb(irrep,i)
+     end do
+     nn = nn + norb_irrep(irrep)
+     write(f_output,*)
+  end do
+
+
+9001 format(6x," Molcas    : ", 10(2x,i5))
+9004 format(6x," Molcas/ir : ", 10(2x,i5))
+9002 format(6x," SelS up   : ", 10(2x,i5))
+9003 format(6x," SelS dn   : ", 10(2x,i5))
+9005 format(6x," SelS      : ", 10(2x,i5))
+
+end Subroutine ordre_orb
+
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/orthog.F90 b/src/orthog.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8cc46cc1a8694d4d9a3167b57d292c9ee10fa0cd
--- /dev/null
+++ b/src/orthog.F90
@@ -0,0 +1,292 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module utils_ortho
+
+  use info
+  use files
+  
+  Implicit none
+
+contains
+
+!$======================================================================== 
+!> @brief Loewdin orthogonormalisation
+!! The S matrix is first diagonalized  using dsyevd (see diag(1))
+!! If the Lapack diagonalisation fails then given is used 
+!> @author MB Lepetit
+!
+!> @param[inout] S(nvec,nvec) = overlap matrix
+!> @param[inout] Vect(nvec,nvec) = vectors to orthonormalize
+!> @param[in] nvec =  number of vectors Vect
+!> @param[in] ndet =  number of determinants
+!> @param[in] tol_norm =  quality of the normalisation
+!> @param[out] iout = diagonalisation error status
+!$======================================================================== 
+subroutine orthog_Sm1demi(S,nvec,vect,ndet,tol_norm,iout)
+  use info
+  use files
+  Implicit none
+  
+  integer, intent(in)                                :: nvec, ndet
+  integer, intent(out)                               :: iout
+  real(kd_dble), intent(in)                          :: tol_norm
+  real(kd_dble), dimension(nvec,nvec), intent(inout) :: S
+  real(kd_dble), dimension(ndet,nvec), intent(inout) :: vect
+  
+  Integer ::  ivec, jvec, kvec
+  real(kd_dble), dimension(:),   allocatable   :: ener
+  real(kd_dble), dimension(:,:), allocatable   :: v, w
+    
+  allocate (v(nvec,nvec), ener(nvec) ) ! vecteurs/valeurs pp
+  ener(:) = 0.d0
+  v(:,:)  = 0.d0
+  iout    = 0
+
+  call diag(S,Ener,V,nvec,1,f_output,iout)
+  
+  if (iout.ne.0) then
+     write(f_output,*) "  ERROR in orthog dsyevd diagonalisation switch to GIVEN "
+     ener(:) = 0.d0
+     v(:,:)  = 0.d0
+     iout    = 0
+     call diag(S,Ener,V,nvec,2,f_output,iout)
+     if (iout.ne.0) &
+          stop ">>> ERROR in orthog GIVEN diagonalisation  <<<"
+  end if
+
+!!$ Reorthogonalisation des vecteurs
+  ! Vérification de dépendence linéaire
+  do ivec = 1,nvec
+     if (abs(ener(ivec)).lt.tol_norm) then
+        ener(ivec) = 0.d0
+        iout = -99
+     else
+        ener(ivec) = 1.d0/sqrt(ener(ivec))
+     end if
+  end do
+  ! calcul de S-1/2
+  S(:,:) = 0.d0
+  do jvec =1,nvec
+     do ivec = 1,nvec 
+        do kvec = 1,nvec
+           S(ivec,jvec) = S(ivec,jvec) + &
+                v(ivec, kvec)* Ener(kvec) * v(jvec, kvec)
+        end do
+     end do
+  end do
+  ! orthogonalisation
+  allocate(w(ndet,nvec))
+  w(:,:)=0.d0
+  do ivec = 1,nvec
+     do jvec = 1,nvec
+        w(1:ndet,ivec) = w(1:ndet,ivec) + S(jvec,ivec)*vect(1:ndet,jvec)
+     end do
+  end do
+  vect(1:ndet,1:nvec) = w(1:ndet,1:nvec)
+
+  deallocate(v,w,Ener)
+  
+end subroutine orthog_Sm1demi
+
+
+!$======================================================================== 
+!> @brief Schmidt orthogonalisation 
+!> @author MB Lepetit
+!
+!> @param[inout] Vect(ndet,nvec) = vectors to orthogonalize to the Vectref ones
+!> @param[in] Vectref(ndet,nvecref) = reference vectors to which Vect will be orthogonilized
+!> @param[in] ndet =  number of determinants
+!> @param[in] nvec =  number of vectors Vect
+!> @param[in] nvecref = number of vectors Vectref
+!> @param[in] tol_orth =  quality of the orthogonalisation
+!> @param jtermax = 20 max number or orthogonalisation loops
+!$======================================================================== 
+subroutine orthog_Schmidt(Vect,Vectref,ndet,nvec,nvecref,tol_orth)
+  
+  use dimensions
+  use files
+  Implicit none
+
+  Integer, parameter :: jtermin=10, jtermax=20
+  Integer, intent(in) :: ndet, nvec, nvecref
+  real(kd_dble),  intent(in) :: tol_orth
+  real(kd_dble), dimension(ndet,nvec), intent(inout) :: Vect
+  real(kd_dble), dimension(ndet,nvecref), intent(in) :: Vectref
+  real(kd_dble) :: tmp
+
+  Logical :: clef
+  Integer :: jter, i, ivec, jvec 
+
+  clef = .true.
+  jter = 0
+  do while ((clef.or.(jter.le.jtermin)).and.(jter.le.jtermax))
+     i = 0
+     jter  = jter + 1
+     do ivec = 1,nvec
+        do jvec = 1, nvecref
+           tmp = dot_product(Vect(1:ndet,ivec),Vectref(1:ndet,jvec))
+           if (abs(tmp).lt.tol_orth) i = i + 1
+           Vect(1:ndet,ivec) = Vect(1:ndet,ivec) - tmp*Vectref(1:ndet,jvec)
+        end do
+     end do
+     if (i.ge.nvec*nvecref) clef=.false.
+  end do
+  if (jter.eq.jtermax)  then
+     write(f_output,*)
+     write(f_output,*) ">>> Schmidt orthogonalisation failed at the desired quality <<<"
+     write(f_output,*) ">>>   tol_orth = ", tol_orth, " <<<"
+     write(f_output,*)
+  end if
+  
+end subroutine orthog_Schmidt
+
+!$======================================================================== 
+!> @brief Orthonormalisation par S-1/2
+!> @author MB Lepetit
+!
+!> @param[inout] Vect(ndet,nvec) = vectors to orthogonalize to the Vectref ones
+!> @param[in] Vectref(ndet,nvecref) = reference vectors to which Vect will be orthogonilized
+!> @param[in] ndet =  number of determinants
+!> @param[in] nvec =  number of vectors Vect
+!> @param[in] nvecref = number of vectors Vectref
+!> @param[in] tol_orth =  quality of the orthogonalisation
+!> @param jtermax = 20 max number or orthogonalisation loops
+!$========================================================================
+subroutine orthonorm(Vect,ndet,nvec,tol_orth,tol_norm,lpr,prog_info,iunit)
+  !  use dimensions
+   use info
+   use files
+   use utils_wrt
+
+   Implicit none
+
+   real(kd_dble), parameter :: max_orthog_Sm1demi=1.0d-15
+
+   real(kd_dble), dimension(ndet,nvec), intent(inout) :: Vect
+   Integer, intent(in)                                :: ndet, nvec
+   real(kd_dble),  intent(in)                         :: tol_orth,tol_norm
+   type(prog_infotype), intent(in)                    :: prog_info
+   logical, intent(in)                                :: lpr
+   integer, optional, intent(in)                      :: iunit
+   
+   real(kd_dble), dimension(:,:), allocatable :: S, Sp
+   Logical :: clef
+   real(kd_dble) :: tmp
+   Integer :: i, ivec, jvec, iout, i_info
+
+   if (present(iunit)) then
+      iout = iunit
+   else
+      iout = f_output
+   endif
+   
+  allocate (S(nvec,nvec),Sp(nvec,nvec))
+  S(:,:) = 0.d0
+  
+  ! Vérification de normalisation et renormalisation si nécessaire
+  do ivec = 1,nvec
+     S(ivec,ivec)  = dot_product(Vect(1:ndet,ivec),Vect(1:ndet,ivec))
+     if (abs(S(ivec,ivec)-1.d0).gt.tol_norm) then
+        if (lpr.and.prog_info%id_cpu.eq.0) &
+             write(iout,'(A,A,I3,A,E14.6,A)') "      ", "vecteur d essai ",ivec, &
+             " de norme^2 1 + ", S(ivec,ivec)-1.d0, " a ete renormalise     "
+        tmp = 1.d0/sqrt(S(ivec,ivec))
+        Vect(1:ndet,ivec) = Vect(1:ndet,ivec)*tmp
+     end if
+  end do
+  
+  ! Vérification d'orthogonalite
+  clef = .true.
+  S(:,:) = 0.d0
+  do jvec = 1,nvec
+     S(jvec,jvec)  = dot_product(Vect(1:ndet,jvec),Vect(1:ndet,jvec))
+     do ivec = 1,jvec-1
+        S(ivec,jvec)  = dot_product(Vect(1:ndet,ivec),Vect(1:ndet,jvec))
+        S(jvec,ivec)  = S(ivec,jvec) 
+        if (abs(S(ivec,jvec)).gt.max_orthog_Sm1demi) clef=.false.
+     end do
+  end do
+    
+  
+  ! reorthogonaliser si nécessaire
+  if (clef) goto 9999
+  if (lpr.and.prog_info%id_cpu.eq.0) then 
+     write(iout,*)
+     write(iout,*) &
+          '    > Vecteurs non orthogonaux', &
+          ' --> reorthonormalisation       '
+     write (iout,*) " Overlap matrix between initial vectors (difference to Id) "
+     sp(:,:) = 0.d0
+     do i=1,nvec
+        sp(i,i) = 1.d0
+     end do
+     sp(:,:) = s(:,:) - sp(:,:) 
+     call wrtmatE(Sp, nvec, nvec, nvec, iout)
+     write(iout,*)
+  end if
+
+  ! OK S(nvec,nvec), Vect(ndet,nvec)
+  call orthog_Sm1demi(S,nvec,Vect,ndet,tol_norm,i_info)
+  if (i_info.eq.-99) then
+     if (prog_info%id_cpu.eq.0) &
+          call SASS_quit('>>>>> Guess vectors linearly dependent <<<<<<',&
+          f_output)
+  end if
+
+  if (lpr) then
+     do jvec = 1,nvec
+        S(jvec,jvec)  = dot_product(Vect(1:ndet,jvec),Vect(1:ndet,jvec))
+        do ivec = 1,jvec-1
+           S(ivec,jvec)  = dot_product(Vect(1:ndet,ivec),Vect(1:ndet,jvec))
+           S(jvec,ivec)  = S(ivec,jvec) 
+        end do
+     end do
+     if (prog_info%id_cpu.eq.0) then 
+        write(iout,*)
+        write(iout,*) '    > Vecteurs reorthogonalises'
+        write (iout,*) " Overlap matrix between final vectors (difference to Id) "
+        sp(:,:) = 0.d0
+        do i=1,nvec
+           sp(i,i) = 1.d0
+        end do
+        sp(:,:) = s(:,:) - sp(:,:) 
+        call wrtmatE(Sp, nvec, nvec, nvec, iout)
+        write(iout,*)
+     end if
+  end if
+    
+9999 deallocate(S, sp)
+  
+
+end subroutine orthonorm
+
+end module utils_ortho
+
diff --git a/src/prop.F90 b/src/prop.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a5298c40bf76d62d09d8ae2da704128edeace17b
--- /dev/null
+++ b/src/prop.F90
@@ -0,0 +1,288 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!> @file Main for the properties of SASS program
+!> @author Marie-Bernadette Lepetit and Elisa Rebolini
+
+Program proprietes
+!!$ -------- Donness globales ---------------------------------
+  use info
+  use info_prop
+  use files
+  use typedet
+  use spindetact
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  use utils_char
+  use utils_wrt
+  
+!!$ -------- Donnes locales -----------------------------------
+  implicit none
+  
+  type(prop_infotype)   :: prop_info
+  type(prog_infotype)   :: prog_info
+  type(g_infotype)      :: g_info
+  type(o_infotype)      :: o_info
+  type(v_infotype)      :: v_info
+  type(det_infotype)    :: det_info
+  type(sym_infotype)    :: sym_info
+
+  
+  ! det
+  type(deter), dimension(:), allocatable ::  det, ref0
+  Integer (KIND=kd_int) :: ndet, nvec, nblock, nelact, nact
+  Integer, dimension(:), allocatable :: shtblkdet, nblkdet, deter_index
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  type(spindetact_list), pointer :: r0
+  type(deter_dblocklist) :: d
+
+  ! vecteurs
+  real(kd_dble), dimension(:,:),  allocatable :: psi
+  real(kd_dble), dimension(:),    allocatable :: ener, psi_S
+  
+  ! prop
+  Integer(KIND=kd_int) :: nprop
+  character*5, dimension(:), allocatable :: whichprop
+
+  ! impressions
+  integer, parameter :: pas = 10
+  character*1, parameter :: A1=" "
+
+  ! autres
+  integer ::  idet, ivec, iprop, nb_thread
+  integer ::  nr, nq, iwr, i, j, nref0lu
+  real(kd_dble) :: tstart, tend, wstart, wend, wstart1, wend1,t1, t2, wt1, wt2
+
+  CHARACTER(LEN=8)     :: date      ! returned values from DATE_AND_TIME()
+  CHARACTER(LEN=10)    :: time
+  CHARACTER(LEN=5)     :: zone
+  INTEGER,DIMENSION(8) :: values 
+  
+  
+  
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+!!$-----
+!!$----- Initialisations 
+!!$-----
+  call init_prop(g_info, prog_info, o_info, v_info, det_info,sym_info, prop_info)
+
+#ifdef VAR_OMP
+  !$OMP PARALLEL SHARED(nb_thread)
+  nb_thread=OMP_GET_MAX_THREADS()
+  !$OMP END PARALLEL
+  
+  prog_info%nb_thread = nb_thread
+#endif
+
+  ! Definition des fichiers
+  call def_files_prop(prog_info, ndet)
+  flush(f_output)
+
+  
+  call gettime(tstart, wstart)
+  
+  
+  ! lecture des x_info
+  read(f_info) prog_info
+  read(f_info) g_info
+  read(f_info) o_info
+  read(f_info) v_info
+  read(f_info) det_info
+  read(f_info) nblock
+  allocate(shtblkdet(nblock), nblkdet(nblock), deter_index(nblock))
+  shtblkdet(:) = 0
+  nblkdet(:)   = 0
+  deter_index  = 99
+  read(f_info) shtblkdet(1:nblock), nblkdet(1:nblock), deter_index(1:nblock)
+  read(f_info) sym_info
+
+  call read_propinp(prop_info, nref0lu, f_input)
+  prog_info%restart = .true.
+  ndet   = det_info%ndet
+  nvec   = v_info%nvec
+  nelact = g_info%nelact
+  nact   = o_info%nact
+  det_info%nref0 = nref0lu
+  
+!!$-----
+!!$ --- Generation des det
+!!$-----
+    if (prog_info%methodAct.eq.'cas') then
+       det_info%nref0 = comb(o_info%nact,g_info%na) * comb(o_info%nact,g_info%nb)
+     call deter_init(ref0, nref0lu)
+     call gener_cas(ref0, prog_info, det_info, g_info, o_info)
+  else
+     call deter_init(ref0, nref0lu)
+     call lect_ref0(ref0, prog_info, det_info, g_info, o_info, v_info)
+  end if
+  if (prog_info%id_cpu.eq.0)  flush(f_output)
+
+  
+  call detact_all_init(r, nb_rlist)  
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*)
+     write(f_output,*)">>> Generation of all determinants"
+     flush(f_output)
+  endif
+  call gettime(t1,wstart1)
+  ! Calcul des conf de spin des ref0
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  ! Calcul des conf de spin des ref1
+  call generspin_ref1(ref0, r, o_info, det_info, g_info%nelact, prog_info)
+  call deter_free(ref0)
+
+  ! Generation of all active determinants
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  ! Generation of all determinants   
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, o_info, v_info, prog_info, .false.)
+  call gettime(t2,wend1)
+  if (prog_info%id_cpu.eq.0) then
+     write(f_output,*) '>>>Determinants generated in',t2-t1,'second(s)'
+     flush(f_output)
+  endif
+
+!!$-----
+!!$ --- Lecture des det 
+!!$-----
+  write(f_output,*)
+  write(f_output,*) '>>> Reading determinants in file bdet'
+  allocate (det(ndet))
+  call read_bdet(det,ndet,f_bdet)
+
+!!$-----
+!!$ --- Lecture des vecteurs
+!!$-----
+  write(f_output,*)
+  write(f_output,'(" >>> Reading vectors from file restart")')
+  allocate(psi(ndet,nvec), ener(nvec))
+  psi(:,:) = 0.d0
+  ener(:)  = 0.d0
+  call lect_vect(psi, ener, ndet, nvec)
+  
+!!$-----
+!!$ --- Projection sur le cas
+!!$-----
+  call gettime(t1,wt1)
+  write(f_output,*)
+  write(f_output,*) " >>> Vectors projection on active space"
+  call cass_proj(psi, ener, ndet, nvec, nelact,det, det_info, o_info, &
+       nblock, shtblkdet,nblkdet,deter_index,f_output)
+  call gettime(t2,wt2)
+  write(f_output,*)
+  write(f_output,'(X,A,A,F17.2,A,F17.2,A)') '>>> Active space projection in ',&
+       'CPU time ',t2-t1,'s, Wall time ',wt2-wt1,' s'
+  flush(f_output)
+  
+!!$-----
+!!$ --- Autres propriétés
+!!$-----
+  nprop = prop_info%nprop
+  if (nprop.eq.0) goto 9999
+  
+  allocate(whichprop(nprop))
+  whichprop(1:nprop) = prop_info%whichprop(1:nprop)
+
+
+  do iprop = 1, nprop
+     call lowercase(whichprop(iprop))
+     select case (whichprop(iprop))
+     case("s-s2")
+        write(f_output,*) 
+        write(f_output,*) " >>>  Total S "
+        allocate(psi_S(nvec))
+        psi_S(:) = 0.d0
+        call s2(psi,psi_S,ndet,nvec,nelact, det, det_info, d, o_info, f_output)
+          nq=nvec/10
+          nr=nvec - nq*pas
+          do i =1,nq
+             write(f_output,'(" S    ")',advance='no')
+             do iwr = 1, max(2*nact +1-6,0)
+                write(f_output,'(a1)',advance='no') A1
+             end do
+             write(f_output,9012) psi_S((i-1)*pas+1:i*pas)
+          end do
+          write(f_output,'(" S    ")',advance='no')
+          do iwr = 1, max(2*nact +1-6,0)
+             write(f_output,'(a1)',advance='no') A1
+          end do
+          write(f_output,9012) psi_S(nq*pas+1:nvec)
+          write(f_output,*)
+          deallocate(psi_S)
+9012      format(10(F18.8,2x))
+     case("pref1")
+        ! Projection sur les ref1
+        write(f_output,*) 
+        write(f_output,*) " >>>  Projection on Ref1"
+        write(f_output,*) "      Not yet implemented"
+     case("lcoef")
+        ! Projection sur les ref1
+        write(f_output,*) 
+        write(f_output,*) " >>>  Projection on determinants with coefficients largest than 0.05"
+        write(f_output,*) "      Not yet implemented"
+     case("dens")
+        ! Calcul de la matrice densite
+        write(f_output,*) 
+        write(f_output,*) " >>> One particule density matrix"
+        write(f_output,*) "     Not yet implemented"
+     end select
+  end do
+
+  
+ 
+  
+9001 format(a7," :",a80)
+9993 format (5x,10(E15.6,1x))
+9994 format ("Ener ",10(F15.6,1x))
+9995 format (a5,10(F15.6,1x))
+
+9999 write(f_output,*)
+  write(f_output,*) ' <<< End of prop code >>> '
+  write(f_output,*)
+  
+  deallocate(shtblkdet, nblkdet, deter_index)
+  deallocate(det)
+  deallocate(psi, ener)
+
+  call gettime(tend,wend)
+
+  call date_and_time(date, time, zone, values)
+  write(f_output,'(X,A,F17.2,A,F17.2,A)') 'Calculation finished in CPUtime',&
+       tend-tstart,'s Walltime:', &
+       wend-wstart,'s'
+     
+  write(f_output,*) 'Calculation finished on ', date(7:8),'-',date(5:6),&
+       '-',date(1:4), ' at ', time(1:2),':',time(3:4)
+
+end Program proprietes
diff --git a/src/proprietes.F90 b/src/proprietes.F90
new file mode 100644
index 0000000000000000000000000000000000000000..c43a55991c09d05ad933b34c6b288b7fbb96e942
--- /dev/null
+++ b/src/proprietes.F90
@@ -0,0 +1,378 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+!$====================================================================
+!> @brief Projection of states on the CAS determinants
+!> @author MBL
+!> @date Mai 2020
+!
+!> @param[in] psi(ndet,nvec) = states matrix
+!> @param[in] Ener(nvec)    = eigenvalues
+!> @param[in] ndet = number of determinants
+!> @param[in] nvec = number of vectors
+!> @param[in] nvec = number of active electrons
+!> @param[in] iunit : output file
+!$====================================================================
+
+subroutine cass_proj(psi, ener, ndet, nvec, nelact, det, &
+     det_info, o_info, nblock, shtblkdet,nblkdet,deter_index,iunit)
+  use dimensions
+  use info
+  use typedet
+  use utils 
+  use utils_wrt
+  
+  implicit none
+  Integer (KIND=kd_int),        intent(in) :: ndet, nvec, nblock, nelact, iunit
+  type(det_infotype),           intent(in) :: det_info
+  type(o_infotype),             intent(in) :: o_info
+  type(deter), dimension(ndet), intent(in) :: det
+  Integer, dimension(nblock),   intent(in) :: shtblkdet, nblkdet, deter_index
+  real(kd_dble), dimension(ndet,nvec), intent(in) :: psi
+  real(kd_dble), dimension(nvec),      intent(in) :: ener
+  !real(kd_dble), dimension(:), allocatable ::  psi_S
+  integer, parameter :: pas = 10
+  character*1, parameter :: A1=" " 
+  
+  real(kd_dble), dimension(nvec) :: normevec
+  integer :: nd00, shift, nact
+  integer :: idet, ivec, nq, nr, i, iwr
+
+ 
+  ! bloc D00 (1er bloc)
+  if (deter_index(1).ne.00) return
+
+  nact = o_info%nact
+  
+  normevec(:) = 0.d0
+  shift       = shtblkdet(1)
+  do ivec = 1,nvec
+     do idet = 1, nblkdet(1)
+        normevec(ivec) = normevec(ivec) + psi(idet+shift,ivec)*psi(idet+shift,ivec)
+     end do
+  end do
+
+  ! allocate(psi_S(nvec))
+  ! psi_S(:) = 0.d0
+  !call s2(psi,psi_S,ndet,nvec,nelact, det, det_info,o_info, iunit)
+  
+  nq=nvec/10
+  nr=nvec - nq*pas
+  do i =1,nq
+     write(iunit,'(" Vect ")',advance='no')
+     do iwr = 1, max(2*nact +1-6,0)
+        write(iunit,'(a1)',advance='no') A1
+     end do
+     write(iunit,9010) (ivec, ivec=(i-1)*pas+1,i*pas)
+
+     write(iunit,'(" Ener ")',advance='no')
+     do iwr = 1, max(2*nact +1-6,0)
+        write(iunit,'(a1)',advance='no') A1
+     end do
+     write(iunit,9012) ener((i-1)*pas+1:i*pas)
+
+     write(iunit,'(" Pcas ")',advance='no')
+     do iwr = 1, max(2*nact +1-6,0)
+        write(iunit,'(a1)',advance='no') A1
+     end do
+     write(iunit,9012) normevec((i-1)*pas+1:i*pas)
+
+     ! write(iunit,'(" S    ")',advance='no')
+     ! do iwr = 1, max(2*nact +1-6,0)
+     !    write(iunit,'(a1)',advance='no') A1
+     ! end do
+     ! write(iunit,9012) psi_S((i-1)*pas+1:i*pas)
+     
+     write(iunit,*)
+     do idet = 1, nblkdet(1)
+        call  wrtact(det(idet)%detact, f_output, .true., o_info%nact)  
+        do iwr = 1,6 - (2*nact +1)
+           write(iunit,'(a1)',advance='no') A1
+        end do
+        write(iunit,9012) psi(idet,(i-1)*pas+1:i*pas)
+     end do
+     write(iunit,*)
+     write(iunit,*)
+  end do
+
+
+  
+  if (nr.eq.0) return
+  write(iunit,'(" Vect ")',advance='no')
+  do iwr = 1, max(2*nact +1-6,0)
+     write(iunit,'(a1)',advance='no') A1
+  end do
+  write(iunit,9010) (ivec, ivec=nq*pas+1,nvec)
+  
+  write(iunit,'(" Ener ")',advance='no')
+  do iwr = 1, max(2*nact +1-6,0)
+     write(iunit,'(a1)',advance='no') A1
+  end do
+  write(iunit,9012)     ener(nq*pas+1:nvec)
+  
+  write(iunit,'(" Pcas ")',advance='no')
+  do iwr = 1, max(2*nact +1-6,0)
+     write(iunit,'(a1)',advance='no') A1
+  end do
+  write(iunit,9012) normevec(nq*pas+1:nvec)
+  
+   ! write(iunit,'(" S    ")',advance='no')
+   ! do iwr = 1, max(2*nact +1-6,0)
+   !    write(iunit,'(a1)',advance='no') A1
+   ! end do
+   ! write(iunit,9012) psi_S(nq*pas+1:nvec)
+   
+   write(iunit,*)
+   do idet = 1, nblkdet(1)
+      call  wrtact(det(idet)%detact, f_output, .true., o_info%nact)  
+      do iwr = 1,6 - (2*nact +1)
+         write(iunit,'(a1)',advance='no') A1
+      end do
+      write(iunit,9012)     psi(idet,nq*pas+1:nvec)
+   end do
+
+  ! deallocate(psi_S)
+
+
+9010 format(10(10x,I4,6x))
+9012 format(10(F18.8,2x))
+
+end subroutine cass_proj
+
+!$====================================================================
+!> @brief <Psi|S^2|psi>
+!> @author MBL
+!> @date Mai 2020
+!
+!> @param[in] psi(ndet,nvec) = states matrix
+!> @param[in] ndet = number of determinants
+!> @param[in] nvec = number of vectors
+!> @param[in] nvec = number of active electrons
+!> @param[in] iunit : output file
+!$====================================================================
+subroutine s2(psi,psi_S,ndet,nvec, nelact, det, det_info, d, o_info, iunit)
+  use dimensions
+  use info
+  use typedet
+  use utils 
+  use utils_wrt
+  
+  implicit none
+  !Logical, parameter :: ldebug=.false.
+  Integer (KIND=kd_int),        intent(in) :: ndet, nvec, nelact, iunit
+  type(det_infotype),           intent(in) :: det_info
+  type(o_infotype),             intent(in) :: o_info
+  type(deter), dimension(ndet), intent(in) :: det
+  real(kd_dble), dimension(ndet,nvec), intent(in) :: psi
+  Real(kd_dble), dimension(nvec),     intent(inout) :: psi_S
+  type(deter_dblocklist) :: d
+
+  Integer(KIND=kd_int)                     :: nact
+  type(deter), dimension(:),   allocatable :: SmdetI, SmdetJ, SpdetI, SpdetJ
+  Integer,     dimension(:),   allocatable :: signdetI, signdetJ
+  type(deter), dimension(:,:), allocatable :: SMat
+  Integer,     dimension(:,:), allocatable :: SSignMat
+  integer (Kind= kindTP), dimension(2)     :: trous, part
+  Real(kd_dble), dimension(nvec)           :: psi_S2
+  
+  Integer :: ivec, idet, jdet, kdet,  shtrous, shpart, &
+       nmoinsI, nmoinsJ, nplusI, nplusJ
+  Integer :: i,j, itmp
+
+  real(kd_dble) :: t1, t2, t3, t4, t5, t6, wt1, wt2, wt3, wt4, wt5, wt6
+
+  nact =  o_info%nact
+  psi_S2(:) = 0.d0
+
+  shtrous = 2*o_info%ngel +   o_info%nocc +   o_info%nligo
+  shpart  = 2*o_info%ngel + 2*o_info%nocc + 2*o_info%nligo &
+       +    2*o_info%nact &
+       +      o_info%nligv +  o_info%nvirt
+
+
+  allocate(SSignMat(0:nelact+4,ndet),SMat(nelact+4,ndet))
+  
+!!$--- Sz Sz
+  !$OMP PARALLEL DEFAULT(SHARED) &
+  !$OMP& PRIVATE(ivec, idet, jdet, kdet, itmp, i, j, SmdetI, SmdetJ, SpdetI, SpdetJ), &
+  !$OMP& PRIVATE(signdetI, signdetJ, nmoinsI, nmoinsJ, nplusI, nplusJ)
+
+  !$OMP MASTER
+  call gettime(t1,wt1)
+  !$OMP END MASTER
+  
+  !$OMP DO reduction(+:psi_S2)
+  do idet = 1,ndet
+     itmp = 0
+     call sz_det(det(idet),itmp,o_info,shtrous, shpart)
+     do ivec = 1,nvec
+        psi_S2(ivec) =  psi_S2(ivec) + 0.25d0*psi(idet,ivec)*dble(itmp*itmp)*psi(idet,ivec)
+     end do
+  end do
+  !$OMP END DO
+
+  !$OMP MASTER
+  call gettime(t2,wt2)
+  write(f_output,*) ' >>> Sz Sz in',wt2-wt1,'second(s)'
+  ! write(f_output,*) " Apres SzSz =",psi_S2
+  flush(f_output)
+  !$OMP END MASTER
+     
+!!$--- S+ S-
+  !$OMP MASTER
+  write(f_output,*) " alllocate 1"
+  flush(f_output)
+  !$OMP END MASTER
+  !  if (ldebug)   write(f_output,*) " 1/2 <I|S+S-|I> = 1/2 <(S-) I | (S-) I>"
+  !$OMP DO reduction(+:psi_S2)
+  do idet = 1,ndet
+     call smoins_det(det(idet),SmdetI,signdetI,nmoinsI, o_info, shtrous, shpart)
+     SSignMat(0,idet)         = nmoinsI
+     SSignMat(1:nmoinsI,idet) = signdetI(1:nmoinsI)
+     SMat(1:nmoinsI,idet)     = SmdetI(1:nmoinsI)
+     do ivec = 1,nvec
+        psi_S2(ivec) =  psi_S2(ivec) + 0.5d0*psi(idet,ivec)*dble(nmoinsI)*psi(idet,ivec)
+     end do
+     deallocate (SmdetI,signdetI)
+  end do
+  !&OMP END DO
+  
+  !$OMP MASTER
+  call gettime(t3,wt3)
+  write(f_output,*) ' >>> 1/2 <I|S+S-|I> in',wt3-wt2,'second(s)'
+  ! write(f_output,*) " Diag  S+S- =",psi_S2
+  flush(f_output)
+  !$OMP END MASTER
+  
+
+  ! if (ldebug) write(f_output,*) " 1/2 <I|S+S-|J> = 1/2 <(S-) I | (S-) J>"
+  !$OMP DO reduction(+:psi_S2)
+  do jdet = 1,ndet
+     ! call smoins_det(det(jdet),SmdetJ, signdetJ, nmoinsJ, o_info, shtrous, shpart)
+     do idet = 1,jdet-1
+        ! call smoins_det(det(idet),SmdetI, signdetI, nmoinsI, o_info, shtrous, shpart)
+        itmp = 0
+        ! do j=1,nmoinsJ
+        !    do i=1,nmoinsI
+        !       if (eq_det(SmdetJ(j),SmdetI(i))) then
+        !          itmp = itmp + signdetJ(j)*signdetI(i)
+        !       end if
+        !    end do
+        ! end do
+        do j = 1, SSignMat(0,jdet)
+           do i = 1, SSignMat(0,idet)
+              if (eq_det(SMat(j,jdet),SMat(i,idet))) &
+                   itmp = itmp + SSignMat(j,jdet)*SSignMat(i,idet)
+           end do
+        end do
+        do ivec = 1,nvec
+           psi_S2(ivec) =  psi_S2(ivec) + psi(idet,ivec)*dble(itmp)*psi(jdet,ivec)
+        end do        
+        ! deallocate (SmdetI,signdetI)
+     end do
+     ! deallocate (SmdetJ,signdetJ)
+  end do
+  !&OMP END DO
+  
+  !$OMP MASTER
+  call gettime(t4,wt4)
+  write(f_output,*) ' >>> 1/2 <I|S+S-|J> in',wt4-wt3,'second(s)'
+  ! write(f_output,*) " Ediag S+S- =",psi_S2
+  flush(f_output)
+  !$OMP END MASTER
+     
+!!$--- S- S+
+  !  if (ldebug) write(f_output,*) " 1/2 <I|S-S+|I> = 1/2 <(S+) I | (S+) I>"
+  !$OMP DO reduction(+:psi_S2)
+  do idet = 1,ndet
+     call splus_det(det(idet),SpdetI, signdetI, nplusI, o_info, shtrous, shpart)
+     SSignMat(0,idet)         = nplusI
+     SSignMat(1:nplusI,idet) = signdetI(1:nplusI)
+     SMat(1:nplusI,idet)     = SpdetI(1:nplusI)
+     do ivec = 1,nvec
+        psi_S2(ivec) =  psi_S2(ivec) + 0.5d0*psi(idet,ivec)*dble(nplusI)*psi(idet,ivec)
+     end do
+     deallocate (SpdetI,signdetI)
+  end do
+  !&OMP END DO
+  !$OMP MASTER
+  call gettime(t5,wt5)
+  write(f_output,*) ' >>> 1/2 <I|S-S+|I> in',wt5-wt4,'second(s)'
+  !  write(f_output,*) " Diag  S-S+ =",psi_S2
+  flush(f_output)
+  !$OMP END MASTER
+  
+  !  if (ldebug) write(f_output,*) " 1/2 <I|S-S+|J> = 1/2 <(S+) I | (S+) J>"
+  !$OMP DO reduction(+:psi_S2)
+  do jdet = 1,ndet
+     ! call splus_det(det(jdet),SpdetJ, signdetJ, nplusJ, o_info, shtrous, shpart)
+     do idet = 1,jdet-1
+        ! call splus_det(det(idet),SpdetI, signdetI, nplusI, o_info, shtrous, shpart)
+        itmp = 0
+        ! do j=1,nplusJ
+        !    do i=1,nplusI
+        !       if (eq_det(SpdetJ(j),SpdetI(i))) itmp = itmp +  signdetJ(j)*signdetI(i)
+        !    end do
+        ! end do
+        do j = 1, SSignMat(0,jdet)
+           do i = 1, SSignMat(0,idet)
+              if (eq_det(SMat(j,jdet),SMat(i,idet))) then
+                 itmp = itmp + SSignMat(j,jdet)*SSignMat(i,idet)
+              end if
+           end do
+        end do
+        do ivec = 1,nvec
+           psi_S2(ivec) =  psi_S2(ivec) + psi(idet,ivec)*dble(itmp)*psi(jdet,ivec)
+        end do
+        ! deallocate (SpdetI,signdetI)
+     end do
+     ! deallocate (SpdetJ,signdetJ)
+  end do
+  !&OMP END DO
+  
+  !$OMP MASTER
+  call gettime(t6,wt6)
+  write(f_output,*) ' >>> 1/2 <I|S-S+|J> in',wt6-wt5,'second(s)'
+  ! write(f_output,*) " Ediag S-S+ =",psi_S2
+  write(f_output,*)
+  flush(f_output)
+  !$OMP END MASTER
+
+  !$OMP END PARALLEL
+  deallocate(SSignMat,SMat)
+  
+  do ivec = 1,nvec
+     psi_S(ivec) = 0.5d0*(-1.d0+sqrt(1.d0+4.d0*psi_S2(ivec)))
+  end do
+  !if (ldebug)
+  ! write(f_output,9002) psi_S2(1:nvec)
+9002 format(" S2   ",10(2x,F18.8))
+ 
+end subroutine s2
diff --git a/src/ref0.F90 b/src/ref0.F90
new file mode 100644
index 0000000000000000000000000000000000000000..a3b1a5c2176cfe5f7b13f68a7967125ddbfb53c9
--- /dev/null
+++ b/src/ref0.F90
@@ -0,0 +1,783 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!> @brief Read and generates the scpin configuration for the
+!! reference 0
+module gener_ref0
+
+  use info
+  use utils_char
+  use utils_wrt
+  use typedet
+  use utils_bits
+  use utils
+  use detact
+  use dimensions
+
+  implicit none
+
+  real (KIND=kd_dble), dimension(:,:), allocatable :: vecref0   
+
+contains
+
+  
+  !$============================================================
+  !> @brief Read the ref0s from input file
+  !> @author MB Lepetit
+  !> @date 2017
+  !$============================================================
+  Subroutine  lect_ref0(ref, prog_info, det_info, g_info, o_info, v_info)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(inout) :: ref
+    type(prog_infotype), intent(in)   :: prog_info
+    type(g_infotype), intent(in)      :: g_info
+    type(o_infotype), intent(in)      :: o_info
+    type(v_infotype), intent(in)      :: v_info
+    type(det_infotype), intent(in)    :: det_info
+
+!!$ -------- Donnes locales -----------------------------------
+    Integer (KIND=kd_int)   :: i, nsft
+    character*6, dimension(:), allocatable :: ref_tmp
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+    !Shift for the 1st active
+    nsft = o_info%ngel + o_info%nocc + o_info%nligo
+
+    ! lecture ref0
+    ! Temp array to store the strings 44u 45d etc... in the ref0 def
+    allocate(ref_tmp(g_info%nelact))
+    
+    rewind(f_ref0)
+    do i = 1,det_info%nref0 ! boucle sur les ref0
+       ref_tmp(:)='      '
+       read(f_ref0,*) ref_tmp(1:g_info%nelact)
+       call add2ref0(ref_tmp, ref, i, nsft, g_info%nelact, o_info%nact)
+       if (prog_info%id_cpu.eq.0) then
+          write(f_output,'(i5,"   :    ")',advance='no') i
+          call wrtdet(ref(i),f_output, o_info)
+       endif
+    end do
+    deallocate(ref_tmp)
+    
+    call check_spin(ref, det_info%nref0, v_info%sz, o_info%nact)
+
+  end subroutine lect_ref0
+  
+  !$==================================================================== 
+  !> @brief Add a ref0 line to the actives array
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+
+  !> @param[in] reftmp Reference conf read from input
+  !! For example: 52u 53u 54u 55u 56u 57u 58u 59u
+  !> @param[inout] ref Determinant List where reftmp should be inserted
+  !> @param[in] i Position where it should be inserted
+  !> @param[in] nsft Shift for the first active orbital
+  !> @param[in] nelCAS Number of active electrons
+  !> @param[in] nact Number of active orbitals
+  !$==================================================================== 
+  subroutine add2ref0(ref_tmp, ref, i, nsft, nelCAS, nact)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(inout) :: ref
+    character*6, dimension(:), allocatable, intent(in)    :: ref_tmp
+    integer(kd_int), intent(in)                           :: i, nsft
+    integer(kd_int), intent(in)                           :: nelCAS, nact          
+
+    integer(kindact) :: tmpact
+    integer(kd_int) :: j, n, ibit, itmp
+    character*6 :: tmp
+
+    tmpact = 0
+    do j = 1,nelCAS ! boucle sur les electrons actifs 
+       tmp = ref_tmp(j)
+       call noblancs (tmp, n)
+       read (tmp(1:n-1),'(I10)') itmp
+       ibit = itmp - nsft -1
+       if ((ibit .lt. 0) .or. (ibit .ge. nact)) then
+          call SASS_quit(">>> Ref0 definition and number of orbital dont match <<<",6)
+       endif
+       if (tmp(n:n) .eq. "u") then
+          tmpact = ibset(tmpact, ibit)
+       else if (tmp(n:n) .eq. "d") then
+          tmpact = ibset(tmpact, ibit+nact)
+       else
+          call SASS_quit(">>> Error in file ref0 : spins must be either u or d <<<",5)
+       end if
+    end do
+    ref(i)%detact = tmpact
+
+  end subroutine add2ref0
+
+  !$============================================================
+  !> @brief gener complete CAS as Ref0
+  !> @author MB Lepetit
+  !> @date 2019
+  !$============================================================
+  Subroutine  gener_cas(ref, prog_info, det_info, g_info, o_info)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(inout) :: ref
+    type(prog_infotype), intent(in)   :: prog_info
+    type(g_infotype), intent(in)      :: g_info
+    type(o_infotype), intent(in)      :: o_info
+    type(det_infotype), intent(in)    :: det_info
+
+    
+!!$ -------- Donnes locales -----------------------------------
+    Integer (KIND=kd_int)  :: na, nb,  ndetCAS, ndetCASa, ndetCASb, nact
+    Integer (KIND=kd_int)  :: ia, ib, ibit, idet
+    integer(kindact) :: macta, mactb, ideta, idetb
+    integer(kindact), dimension(:), allocatable :: CASa, CASb
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+    na     = g_info%na
+    nb     = g_info%nb
+    nact   = o_info%nact
+
+    allocate(CASa(comb(nact,na))) 
+    allocate(CASb(comb(nact,nb)))
+    CASa(:) = 0
+    CASb(:) = 0
+    
+    !Generation CAS
+    ndetCAS  = 0
+    macta    = 0
+    mactb    = 0
+    do ibit = 0,nact-1
+       macta = ibset(macta, ibit)
+       mactb = ibset(mactb, ibit+nact)
+    end do
+    
+    ndetCASa = 0
+    do ideta = 0, macta
+       if (sumbits(Ideta,0,nact-1) .eq. na) then
+          ndetCASa = ndetCASa + 1
+          CASa(ndetCASa) = ideta
+       end if
+    end do
+
+    ndetCASb = 0
+    do idetb = 0, mactb
+       if ((sumbits(Idetb,0,nact-1) .eq. 0) .and. (sumbits(Idetb,nact,2*nact-1) .eq. nb)) then
+          ndetCASb = ndetCASb + 1
+          CASb(ndetCASb) = idetb
+       end if
+    end do
+
+    ndetCAS = ndetCASa * ndetCASb
+    if (ndetCAS .ne. det_info%nref0) then
+       write(f_output,*) 'ndetCAS',ndetCAS, 'nref0', det_info%nref0
+       flush(f_output)
+       STOP ">>> Error in CAS generation : 1"
+    end if
+    do ia = 1, ndetCASa
+       do ib = 1, ndetCASb
+          idet = ib + (ia-1)*ndetCASb
+          ref(idet)%detact =  CASa(ia) + CASb(ib)
+       end do
+    end do
+    
+    deallocate(CASa,CASb)
+    
+    if (prog_info%id_cpu.eq.0) then
+       do idet = 1,ndetCAS
+          write(f_output,'(i5,"   :    ")',advance='no') idet
+          call wrtdet(ref(idet),f_output, o_info)
+       end do
+    end if
+
+  end subroutine gener_cas
+
+  !$==================================================================== 
+  !> @brief Check that the spin of a deter object matches a given Sz
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+
+  !> @param[in] ref deter object
+  !> @param[in] nref number of references
+  !> @param[in] spin Sz value
+
+  !$==================================================================== 
+  subroutine check_spin(ref, nref, Sz, nact)
+
+    implicit none
+    
+    type(deter), dimension(:), allocatable, intent(in) :: ref
+    integer, intent(in)                                :: nref
+    integer(kd_int), intent(in)                        :: Sz, nact
+
+    integer(kd_int)  :: i, j, itmp
+    integer(kindact) :: tmpact
+
+    do  i = 1,nref ! boucle sur les ref
+       tmpact =  ref(i)%detact
+       itmp = 0
+       do j = 1,nact ! boucle sur les orb alpha
+          if (btest(tmpact,j-1)) itmp = itmp +1
+       end do
+       do j = 1+nact,2*nact ! boucle sur les orb beta 
+          if (btest(tmpact,j-1)) itmp = itmp -1
+       end do
+       if (itmp .ne. Sz) then 
+          write(f_output,'(" Ref0 : ",i5," 2Sz de ref0 : ",i3," 2Sz = ",i3)') &
+               i,itmp,Sz
+          call SASS_quit(">>> Sz de ref0 incompatible avec valeur de Sz <<<",f_output) 
+       end if
+    end do
+  end subroutine check_spin
+
+
+  !$============================================================
+  !> @brief Generate the spin configurations for each ref0
+  !$------------------------------------------------------------
+  !! Engendre les configurations de spin des ref0 
+  !!   1) Pour chaque ref0 lue calculer le Sz max
+  !!         2 types 
+  !!         - que des couches ouvertes : abcd
+  !!         - avec des couches fermées : aa cd
+  !!   2) Pour chaque ref0 lue calculer le det de Sz max,  
+  !!          sa partie couche ouverte (=> pas toutes le mm nbre d'électrons)
+  !!          sa partie couche fermée
+  !!   3) Pour chaque ref0 calculer la configuration de spin S,Sz recherchés 
+  !!          si S=Smax : en faisant S- sur conf de spin max 
+  !!          si S\=Smax : en faisant S- sur conf de spin max pour avoir 
+  !!              ts les det de Sz puis en diagonalisant S^2
+  !!   4) On garde tous les det de Sz recherché générés par le processus 
+  !!         + le vecteur associé à la conf de S recherché
+  !!------------------------------------------------------------
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param[inout] ref
+  !> @param[inout] vecref
+  !> @param[inout] r Active det. list - R00 to be filled
+  !> @param[in] o_info Orbital info
+  !> @param[inout] v_info Target state info
+  !> @param[inout] det_info Determinant info
+  !$============================================================
+  subroutine  generspin_ref0(ref, vecref, r, o_info, det_info, v_info,&
+       prog_info)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(inout)     :: ref
+    real(kd_dble), dimension(:,:), allocatable, intent(inout) :: vecref         
+    type(rlist), intent(inout)        :: r
+    type(o_infotype), intent(in)      :: o_info
+    type(v_infotype), intent(inout)   :: v_info
+    type(det_infotype), intent(inout) :: det_info
+    type(prog_infotype), intent(in)   :: prog_info
+
+!!$ -------- Donnes locales -----------------------------------
+
+    ! nco(idet) : nbre de couches ouvertes 
+    ! ncf(idet) : nbre de couches fermées
+    ! esp_co(idet) : partie d'espace pour les couches ouvertes
+    ! esp_cf(idet) : partie d'espace pour les couches fermées
+    ! nespirr, esp_irr : conf d'espace uniques
+    Integer, dimension(:), allocatable :: nco, ncf
+    Integer (Kind= kindact), dimension(:), allocatable :: esp_co, esp_cf
+
+    Integer (Kind= kindact), dimension(:), allocatable :: NewRef0
+    Real    (KIND=kd_dble), dimension(:), allocatable :: vectmp
+
+    Integer (KIND=kd_int) :: nespirr, ncfsp
+    Integer (KIND=kd_int) :: idet, n,  i, j, isz, itmp, isft
+
+    type(detact_list), pointer :: r00
+    logical :: ldebug = .false.
+
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+    if (o_info%nact.gt.32) then
+       write(f_output,*) 'nact',o_info%nact
+       call SASS_quit(">>> monter le nbre de bits de esp <<<",f_output)
+    endif
+
+    allocate(esp_co(det_info%nref0))
+    allocate(esp_cf(det_info%nref0))
+    allocate(nco(det_info%nref0))
+    allocate(ncf(det_info%nref0))
+    
+    ! calcul des couches ouvertes / fermées 
+    call open_close_shell(ref, esp_co, esp_cf, nco, ncf, det_info%nref0, &
+         o_info%nact)
+
+    ! Recherche des configurations d'espace uniques : nbre nespirr
+    ! et Compter tous les det de spin Sz recherchéspour chaque conf
+    call compute_nepsirr(esp_co, esp_cf, nco, ncf, det_info%nref0, &
+         o_info%nact, nespirr, v_info%Sz )
+    
+    if (prog_info%id_cpu .eq. 0) then
+       write(f_output,'("  Nbre de det Ref0 final :",I3)')  Det_Info%Nref0
+    endif
+       
+    ! Pour chaque ref0 calculer la configuration de spin Szmax partie couche ouverte
+    ! Engendrer tous les det de spin Sz recherchés pour cette config
+    allocate(NewRef0(det_info%nref0))
+    allocate(vectmp(det_info%nref0*det_info%nref0))
+    call compute_cfspref0(NewRef0, vectmp, esp_co, esp_cf, nco, ncfsp,  &
+         det_info%nref0, nespirr, o_info%nact, v_info%sz, v_info%stot)
+  
+    ! Save the active parts in R_0^0
+    r00 => get_detact(r,0,0)
+    call fill_detact_list(r00, NewRef0, det_info%nref0)
+
+    ! On met les Newref0 dans les Ref0
+    deallocate(Ref)
+    allocate(Ref(Det_Info%Nref0))
+    do i = 1,det_info%nref0
+       ref(i)%detact    = NewRef0(i)
+       ref(i)%dettr(:)  = 0
+       ref(i)%detprt(:) = 0
+    end do
+
+    ! on met les vecteurs dans vecref0
+    v_info%ncfspref0 = ncfsp
+    allocate (vecref(det_info%nref0,v_info%ncfspref0))
+    vecref(:,:) = 0.d0
+    n = 0
+    isft = 0
+    ncfsp = 0
+    do idet = 1,nespirr
+       isz = nco(idet)
+       if (isz.eq.v_info%Sz) then 
+          n = n+1 
+          ncfsp = ncfsp + 1
+          isft = isft+1
+          vecref(n,ncfsp) = vectmp(isft)
+       else
+          j =  comb(isz,(isz-v_info%Sz)/2)
+          itmp = comb(isz,(isz-v_info%Sz)/2) - comb(isz,(isz-v_info%Sz)/2-1)
+          vecref(n+1:n+j , ncfsp+1:ncfsp+itmp) = &
+               reshape(vectmp(isft+1:isft+j*itmp), (/j,itmp/))
+          ncfsp = ncfsp + itmp
+          isft  = isft + itmp*j
+          n     = n + j 
+       end if
+    end do
+
+    !Debug
+    if (ldebug) then 
+       write(f_output,*)
+       write(f_output,*) "   Nbre de conf S, Sz :", v_info%ncfspref0
+       n = v_info%ncfspref0/10
+       do j = 1,n 
+          do i=1,Det_Info%Nref0
+             call wrtact(NewRef0(i),f_output,.true., o_info%nact)
+             write(f_output,'(10(2x,f10.6))')  (vecref(i, (j-1)*10+1:j*10))
+          end do
+          write(f_output,*)
+       end do
+       if (n.ne.v_info%ncfspref0) then
+          do i=1,Det_Info%Nref0
+             call wrtact(NewRef0(i),f_output,.true., o_info%nact)
+             write(f_output,'(10(2x,f10.6))')  (vecref(i, n*10+1:v_info%ncfspref0))
+          end do
+       end if
+    end if
+
+    deallocate(esp_co)
+    deallocate(esp_cf)
+    deallocate(nco)
+    deallocate(ncf)
+    
+    deallocate(NewRef0)
+    deallocate(vectmp)
+  end Subroutine generspin_ref0
+
+
+
+!!$============================================================
+!!$============================================================
+!!$============================================================
+
+  Subroutine  diag_S2(dimdet,dimcf,dRef0,vcf,nact,stot)
+!!$------------------------------------------------------------
+!!$ Pour une partie d'espace irréductible cherche les conf de sp S,Sz
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+    use info
+    use utils_bits
+    use utils_wrt
+!!$ -------- Donnes locales -----------------------------------
+    Implicit none
+!!$   dimdet : nbre de det Sz associés à la partie d'espace irréductible
+!!$   dimcf  : nbre de conf S,Sz associées à la partie d'espace irréductible
+!!$   dRef0  : dets, partie active couche ouverte uniquement
+!!$   vcf    : confs à trouver
+    
+    Integer (Kind=kd_int), intent(in)                         :: dimdet,dimcf,nact,stot
+    Integer (Kind= kindact), dimension(dimdet), intent(in)    :: dRef0
+    Real (KIND=kd_dble), dimension(dimdet,dimcf), intent(out) :: vcf
+
+    Real (KIND=kd_dble), parameter :: lim1=1.d-10
+    Real (KIND=kd_dble), dimension(dimdet,dimdet) :: S2, Vvp
+    Real (KIND=kd_dble), dimension(dimdet) :: Evp
+
+    Integer (Kind= kindact) :: diff, diffi, diffj
+    Integer (KIND=kd_int) ::  idet, jdet, itmp, natmp, nbtmp, i,n, ibid
+    Real (KIND=kd_dble) :: ssp1
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+    vcf(:,:) = 0.d0
+    
+    S2(:,:)  = 0.d0
+    Vvp(:,:) = 0.d0
+    Evp = 0.d0
+
+    if (debug) then
+       write(f_output,*) "--------------------------------------------"
+       write(f_output,'("    Entree dans diag_S2 pour les etats :")')  
+       do i = 1,dimdet
+          call wrtact(dRef0(i),f_output, .false.,nact)
+       end do
+    end if
+
+    do idet  = 1,dimdet
+       natmp = sumbits(dRef0(idet),0,nact-1)
+       nbtmp = sumbits(dRef0(idet),nact,2*nact-1)
+       ! Sz*Sz
+       itmp =  natmp-nbtmp
+       S2(idet,idet) =  S2(idet,idet) + 0.25d0*dble(itmp*itmp)
+       !  <idet |(S+ S-) + (S- S+)|idet>
+       itmp =  natmp+nbtmp
+       S2(idet,idet) =  S2(idet,idet) + 0.5d0*dble(itmp)
+    end do
+
+    ! <idet |(S+ S-) + (S- S+)|jdet>
+    do jdet  = 1,dimdet
+       do idet = 1,jdet -1
+          diff = ieor(dRef0(idet), dRef0(jdet))
+          if (sumbits(diff,0,nact-1).ne.2) cycle
+          if (sumbits(diff,nact,2*nact-1).ne.2) cycle
+          !
+          diffi = iand(diff,dRef0(idet))
+          if (sumbits(diffi,0,nact-1).ne.1) cycle
+          if (sumbits(diffi,nact,2*nact-1).ne.1) cycle
+          !
+          diffj = iand(diff,dRef0(jdet))
+          if (sumbits(diffj,0,nact-1).ne.1) cycle
+          if (sumbits(diffj,nact,2*nact-1).ne.1) cycle
+          !
+          diff = iand(diffi,diffj)
+          if (sumbits(diff,0,2*nact-1).ne.0) cycle
+          S2(idet,jdet) = S2(idet,jdet) + 1.0d0 
+          S2(jdet,idet) = S2(jdet,idet) + 1.0d0 
+       end do
+    end do
+
+    if (debug) then
+       write(f_output,*) 'Matrix to be diagonalised'
+       call wrtmat(S2,dimdet,dimdet,dimdet,f_output)
+    endif
+       
+    ! Diagonalisation
+    call diag(S2,Evp,Vvp,dimdet,1,f_output, ibid)
+    if (debug) then 
+       write(f_output,*) "   Valeurs pp de S2"
+       write(f_output, '(10(2x,f15.12))') Evp
+    end if
+    ! On ne garde que les VP S*(S+1)
+    n=0
+    ssp1 = dble(stot-1)*dble(stot+1)/dble(4.d0)
+    do i = 1, dimdet
+       if (abs(dble(ssp1)-Evp(i)).gt.lim1) cycle 
+       n=n+1
+       vcf(1:dimdet,n) = Vvp(1:dimdet,i)
+    end do
+    if (n.ne.dimcf) then
+       write(f_output,'("  dimcf=",i4,"  n=",i4)') dimcf, n 
+       call SASS_quit(">>> Erreur Nbre conf spin S ds les Ref0 <<<",f_output)
+    end if
+    if (debug) then 
+       write(f_output,*)
+       write(f_output,*) "   Nbre de conf S, Sz ", dimcf
+       do i=1,dimdet
+          write(f_output,'(10(2x,f10.6))')  (vcf(i,1:dimcf))
+       end do
+       write(f_output,*) "--------------------------------------------"
+       write(f_output,*) 
+    end if
+
+  end Subroutine diag_S2
+
+  !$============================================================
+  !> @brief Compute the number and spatial part of the open
+  !! and closed shels
+  !> @author MB Lepetit
+  !> @date 2017
+  !
+  !> @param esp_co partie d'espace pour les couches ouvertes 
+  !> @param esp_cf partie d'espace pour les couches fermées
+  !> @param nco    nbre de couches ouvertes 
+  !> @param ncf    nbre de couches fermées
+  !> @param nref0  nb of configurations in ref0
+  !> @param nact   nb of active orbitals in ref0
+  !$============================================================
+  subroutine open_close_shell(ref,esp_co,esp_cf,nco,ncf,nref0,nact)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(in) :: ref
+    integer, intent(in)                                :: nref0, nact
+    integer, dimension(nref0), intent(out)             :: nco, ncf
+    integer(kindact), dimension(nref0), intent(out)    :: esp_co, esp_cf
+
+    integer(kindact) :: tmpact, tmpact1, tmpact2, tmpact3
+    integer(kd_int)  :: idet
+
+    ! calcul des couches ouvertes / fermées 
+    nco(:) = 0
+    ncf(:)  = 0
+    
+    do idet= 1,nref0
+       tmpact  = ref(idet)%detact 
+       tmpact2 = ishft(tmpact, -nact)   
+       tmpact3 = ibits(ieor(tmpact,tmpact2), 0, nact)  
+       nco(idet) = sumbits(tmpact3, 0, nact-1)
+       esp_co(idet) = tmpact3
+       tmpact1 = iand(tmpact,tmpact2)
+       ncf(idet) = sumbits(tmpact1, 0, nact-1)
+       esp_cf(idet) = tmpact1
+       if (debug) then 
+          write(f_output,'("  Ref0: ",I5,"  Couches fermees : ",i3," - ")', &
+               advance='no') idet, ncf(idet)
+          call wrtact(tmpact1,f_output,.true., nact)
+          write(f_output,'("  Ref0: ",I5,"  Couches ouvertes: ",i3," - ")', &
+               advance='no') idet,  nco(idet)
+          call wrtact(tmpact3,f_output,.false., nact)
+       end if
+    end do
+  end subroutine open_close_shell
+
+
+  !$============================================================
+  !> @brief Compute the unique spatial part of the open
+  !! and closed shels
+  !> @author MB Lepetit
+  !> @date 2017
+  !
+  !> @param esp_co spatial part for open shells for each ref0
+  !> @param esp_cf spatial part for closed shells for each ref0
+  !> @param nco    nb of open shells for each ref0
+  !> @param ncf    nb of closed shells for each ref0 
+  !> @param nref0  nb of ref0
+  !> @param nact   nb of active orbitals in ref0
+  !> @param nespirr nb of irreducible spatial part
+  !$============================================================
+  subroutine compute_nepsirr(esp_co,esp_cf,nco,ncf,nref0,nact,nespirr,Sz)
+
+    implicit none
+
+    integer, intent(in)                               :: nact, Sz
+    integer, intent(inout)                            :: nref0
+    integer, intent(out)                              :: nespirr
+    integer, dimension(nref0), intent(inout)          :: nco, ncf
+    integer(kindact), dimension(nref0), intent(inout) :: esp_co, esp_cf
+
+    integer(kindact) :: tmpact
+    integer(kd_int)  :: idet, jdet, i, n, j, isz
+    
+    nespirr = 0
+    do idet= 1,nref0
+       do jdet  = 1,idet-1
+          if ((esp_cf(idet).eq.esp_cf(jdet)).and.(esp_co(idet).eq.esp_co(jdet))) & 
+               goto 10
+       end do
+       nespirr = nespirr + 1
+10     continue
+    end do
+    
+    if (debug) then
+       write(f_output,*)
+       write(f_output,'("  Nbre de conf d''espace unique :",I3)')  nespirr
+    endif
+    !
+    i = 0
+    do idet= 1,nref0
+       do jdet  = 1,idet -1
+          if ((esp_cf(idet).eq.esp_cf(jdet)).and.(esp_co(idet).eq.esp_co(jdet))) &
+               goto 11
+       end do
+       i = i+1
+       nco(i)     = nco(idet) 
+       esp_co(i) = esp_co(idet)
+       ncf(i)     = ncf(idet) 
+       esp_cf(i) = esp_cf(idet)
+       if (debug) then 
+          write(f_output,'("  Ref0 irr: ",I5,"  Couches fermees : ",i3," - ")',advance='no') &
+               i, ncf(i)
+          tmpact = esp_cf(i)
+          call wrtactalpha(tmpact,f_output,.true., nact)
+          write(f_output,'("  Ref0 irr: ",I5,"  Couches ouvertes: ",i3," - ")',advance='no') &
+               i,  nco(i)
+          tmpact = esp_co(i)
+          call wrtactalpha(tmpact,f_output,.false., nact)
+       end if
+11     continue
+    end do
+    if (i.ne.nespirr) then
+       write(f_output,'("  nespirr=",i4,"  i=",i4)') nespirr, i 
+       call SASS_quit(">>> Erreur comptage Ref0 irreductibles <<<",f_output)
+    endif
+    nco(nespirr+1:nref0)  = 0
+    ncf(nespirr+1:nref0)  = 0
+    esp_co(nespirr+1:nref0)  = 0
+    esp_cf(nespirr+1:nref0)  = 0
+
+    n = 0
+    do idet = 1,nespirr
+       isz = nco(idet)
+       if (isz.eq.Sz) then 
+          n = n +1
+       else
+          if (isz-Sz.Lt.0) then
+             write(f_output,'("  isz=",i4,"  sz=",i4)') isz, sz 
+             call SASS_quit(">>> Erreur de spin <<<",f_output)
+          endif
+          if (mod(isz-Sz,2).ne.0) then
+             write(f_output,'("  isz=",i4,"  sz=",i4)') isz, sz 
+             call SASS_quit(">>> Erreur de spin <<<",f_output)
+          endif
+          j = (isz-Sz)/2 ! nbre de spins à retourner
+          n = n + comb(isz,j)
+       end if
+    end do
+    nref0 = n
+    
+  end subroutine compute_nepsirr
+
+  !$============================================================
+  !> @brief Compute the spin configurations for ref0
+  !! and closed shels
+  !> @author MB Lepetit
+  !> @date 2017
+  !
+  !> @param NewRef0 active part ref0 with correct spin configurations
+  !> @param vecref0 ref0 with correct spin configurations
+  !> @param esp_co  spatial part for open shells for each ref0
+  !> @param esp_cf  spatial part for closed shells for each ref0
+  !> @param nco     nb of open shells for each ref0
+  !> @param ncf     nb of closed shells for each ref0
+  !> @param ncfsp   nb of spin configurations
+  !> @param nref0   nb of ref0
+  !> @param nact    nb of active orbitals in ref0
+  !> @param nespirr nb of irreducible spatial part
+  !> @param Sz      spin projection
+  !> @param Stot    total spin
+  !$============================================================
+  subroutine compute_cfspref0(NewRef0, vecref0tmp, esp_co, esp_cf, nco, ncfsp, &
+       nref0, nespirr, nact, Sz, Stot)
+
+    implicit none
+    
+    integer(kd_int), intent(in)                        :: nref0, nespirr
+    integer(kd_int), intent(in)                        :: nact, Sz, Stot
+    integer(kindact), dimension(nref0), intent(inout)  :: NewRef0
+    real(kd_dble), dimension(nref0*nref0), intent(out) :: vecref0tmp
+    integer(kindact), dimension(nref0), intent(in)     :: esp_co, esp_cf
+    integer, dimension(nref0), intent(in)              :: nco
+    integer(kd_int), intent(out)                       :: ncfsp
+    
+    integer(kd_int) :: idet, n,  i, j, isz, itmp, isft
+    integer(kindact), dimension(:), allocatable :: Ref0_Szmax
+    integer(kindact) :: tmpact
+
+    ! Pour chaque ref0 calculer la configuration de spin Szmax partie couche ouverte
+    allocate(Ref0_Szmax(nespirr)) 
+    Ref0_Szmax(1:nespirr) =  esp_co(1:nespirr)
+    
+    ! Engendrer tous les det de spin Sz recherchés à partir de cette conf
+    vecref0tmp(:) = 0.d0
+    n = 0
+    isft = 0
+    ncfsp = 0
+    do idet = 1,nespirr
+       isz = nco(idet)
+       if (isz.eq.Sz) then 
+          n = n+1 
+          !  calcul des conf de spin
+          ncfsp = ncfsp + 1
+          vecref0tmp(isft + 1) = 1.d0
+          isft = isft + 1
+          ! on ajoute les couches fermées
+          NewRef0(n) =  ior(Ref0_Szmax(idet), esp_cf(idet))
+          tmpact =  ishft(esp_cf(idet), nact)
+          NewRef0(n) = ior(NewRef0(n), tmpact)
+       else
+          j =  comb(isz,(isz-Sz)/2) ! nbre de det a creer
+          call smoins(Ref0_Szmax(idet),isz,(isz-Sz)/2,j,NewRef0(n+1),nact)
+          ! calcul des conf de spin
+          itmp = comb(isz,(isz-Sz)/2) - comb(isz,(isz-Sz)/2-1)
+          call diag_S2(j,itmp,NewRef0(n+1),vecref0tmp(isft+1),nact,stot)
+          ncfsp = ncfsp + itmp
+          isft = isft + itmp*j
+          ! on ajoute les couches fermées
+          do i = 1 , j
+             NewRef0(n+i) =  ior(NewRef0(n+i) , esp_cf(idet))
+             tmpact =  ishft(esp_cf(idet), nact)
+             NewRef0(n+i) = ior(NewRef0(n+i), tmpact)
+          end do
+          n = n + j
+       end if
+    end do
+
+    if (n.ne.nref0) then
+       write(f_output,'("  nref0=",i4,"  n=",i4)') nref0, n 
+       call SASS_quit( ">>> Erreur Nref0 <<<", f_output)
+    endif
+
+    if (debug) then 
+       write(f_output,'("  Ref0 finaux ")') 
+       do idet = 1, nref0
+          write(f_output,'(i5,"   :   ")',advance='no') idet
+          call wrtact(NewRef0(idet),f_output,.false., nact)
+       end do
+    end if
+
+    deallocate(Ref0_Szmax)
+    
+    ! Ici on a dans NewRef0 les vrais ref0 avec tous les det.
+  end subroutine compute_cfspref0
+end module gener_ref0
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/ref1.F90 b/src/ref1.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9801be019e3bab69a4c62e49aa0dd9d18a662723
--- /dev/null
+++ b/src/ref1.F90
@@ -0,0 +1,850 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+module gener_ref1
+
+  use dimensions
+  use files
+  use detact
+  use typedet
+  use utils_wrt
+
+  implicit none
+
+contains
+
+  !$============================================================
+  !> @brief Generates Ref1 from Ref0
+  !> @author MB Lepetit
+  !> @date 2017
+  !
+  !> @param[in]    ref0
+  !> @param[inout] r
+  !> @param[in]    o_info
+  !> @param[inout] det_info
+  !> @param[in]    nelact
+  !> @param[in]    prog_info
+  !$============================================================
+  subroutine  generspin_ref1(ref0, r, o_info, det_info, nelact, prog_info)
+!!$------------------------------------------------------------
+!!$ Engendre les configurations de spin des ref1
+!!$ pas fini
+!!$        1) Pour chaque ref0 calculer les det mono-excités CAS  -> CAS 
+!!$        2) Pour chaque ref0 calculer les det mono-excités ligo -> CAS
+!!$        3) Pour chaque ref0 calculer les det mono-excités CAS  -> logv
+!!$        4) Pour chaque ref0 calculer les det mono-excités ligo -> ligv
+!!$        4) Pour chaque ref0 calculer les det mono-exciés ligo -> ligv + echange CAS
+!!$------------------------------------------------------------
+!!$ -------- Donness globales ---------------------------------
+    use info
+    use utils_bits
+    use utils_wrt
+    use utils_det
+    use utils
+    
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(in)    :: ref0
+    
+    type(rlist), intent(inout)                            :: r
+    type(o_infotype), intent(in)                          :: o_info
+    type(det_infotype), intent(inout)                     :: det_info
+    type(prog_infotype), intent(in)                       :: prog_info
+    integer, intent(in)                                   :: nelact
+
+    type(deter), dimension(:), allocatable   :: ref1
+    type(detact_list), pointer :: rp10, rm10
+
+!!$ -------- Donnes locales -----------------------------------
+    Logical, parameter :: ldebug = .false., debugcc=.false., debuglc=.false., debugcl=.false., &
+         debugll=.false.
+    Integer (Kind= kindact), dimension(:), allocatable :: NewRef0, NewRef1
+    Type (deter), dimension(:), allocatable :: detCASCAS, detligoCAS, &
+         detCasLigv, detLigoLigv
+    Integer (KIND=kd_int) :: idet, n
+ 
+!!$============================================================
+!!$ -------- Code ---------------------------------------------
+
+    allocate(NewRef0(det_info%nref0))
+    do idet= 1,det_info%nref0
+       NewRef0(idet)  = ref0(idet)%detact 
+    end do
+
+    ! Estimate for allocate
+    call estimate_nref1(Newref0, det_info%nref0, o_info%nligo, o_info%nact, &
+         o_info%nligv, det_info%nref1cascas, det_info%nref1ligocas, &
+         det_info%nref1casligv, det_info%nref1ligoligv, &
+         det_info%nref1)
+
+    ! Engendrer Det mono-excités CAS  -> CAS
+    call gener_ref1cascas(NewRef0, det_info%nref0, detcascas, det_info%nref1cascas, &
+         o_info%nact, r, debugcc)
+
+    ! Engendrer Det mono-excités ligo  -> CAS
+    call gener_ref1ligocas(NewRef0, det_info%nref0, detligocas, &
+         det_info%nref1ligocas, &
+         o_info%nact, o_info%nligo, o_info%ngel, o_info%nocc, nelact, r, debuglc)
+
+    ! Engendrer  Det mono-excités CAS  -> ligv
+    call gener_ref1casligv(NewRef0, det_info%nref0, detcasligv, &
+         det_info%nref1casligv, &
+         o_info%nact, o_info%ngel, o_info%nocc, o_info%nligo, o_info%nligv, &
+         o_info%nvirt, nelact, r, debugcl)
+    
+    ! Engendrer  Det mono-excités  ligo  -> ligv
+    call gener_ref1ligoligv(NewRef0, det_info%nref0, detligoligv, &
+         det_info%nref1ligoligv, &
+         o_info%nact, o_info%ngel, o_info%nocc, o_info%nligo, o_info%nligv, &
+         o_info%nvirt, nelact, r, debugll)
+    
+!!$  Compter exactement les Ref1 et les mettre au bon endroit
+    det_info%nref1 =  det_info%nref1CasCas + det_info%nref1LigoCas + &
+         det_info%nref1CasLigv + det_info%nref1LigoLigv
+    if (ldebug) &
+         write(f_output,'("  Nbre de det Ref1       :",I5)')  det_info%nref1
+
+
+
+    
+    allocate(ref1(det_info%nref1))
+    n = 0
+    !    if (debugcc.and.(det_info%nref1CasCas.ne.0)) then
+    if (prog_info%id_cpu.eq.0)  write(f_output,'("  Ref1 Cas  -> Cas  :",i5," -> ",i5)') 1, &
+            det_info%nref1CasCas
+    !    endif
+    do idet = 1,det_info%nref1CasCas
+       n = n+1
+       ref1(n) = detCASCAS(idet)
+       if (debugcc) then 
+          write(f_output,'(1x,i6,": ")',advance="no") n
+          call wrtdet(ref1(n), f_output, o_info) 
+       end if
+    end do
+    !
+    if (debuglc.and.(det_info%nref1LigoCas.ne.0)) then
+       write(f_output,'(" Ref1 Ligo -> Cas       :",i5," -> ",i5)') n+1, &
+            n+det_info%nref1LigoCas
+    end if
+    do idet = 1,det_info%nref1LigoCas
+       n = n+1
+       ref1(n) = detLigoCAS(idet)
+       if (debuglc) then 
+          write(f_output,'(1x,i6,": ")',advance="no") n
+          call wrtdet(ref1(n), f_output, o_info) 
+       end if
+    end do
+    !
+    if (debugcl.and.(det_info%nref1CasLigv.ne.0)) then
+       write(f_output,'(" Ref1 Cas  -> Ligv :",i5," -> ",i5)') n+1, &
+            n+det_info%nref1CasLigv
+    end if
+    do idet = 1,det_info%nref1CasLigv
+       n = n+1
+       ref1(n) = detCASLigv(idet)
+       if (debugcl) then 
+          write(f_output,'(1x,i6,": ")',advance="no") n
+          call wrtdet(ref1(n), f_output, o_info) 
+       end if
+    end do
+    !
+    if (debugll.and.(det_info%nref1LigoLigv.ne.0)) then
+       write(f_output,'(" Ref1 Ligo -> ligv :",i5," -> ",i5)') n+1, &
+            n+det_info%nref1LigoLigv
+    end if
+    do idet = 1,det_info%nref1LigoLigv
+       n = n+1
+       ref1(n) = detLigoLigv(idet)
+       if (debugll) then 
+          write(f_output,'(1x,i6,": ")',advance="no") n
+          call wrtdet(ref1(n), f_output, o_info) 
+       end if
+    end do
+
+    deallocate(newref0)
+    deallocate(detCASCAS)
+    if (o_info%nligo .ne. 0) deallocate(detligoCAS)
+    if (o_info%nligv .ne. 0) deallocate(detCasLigv)
+    if ((o_info%nligo .ne. 0).and.(o_info%nligv .ne. 0)) deallocate(detligoligv)
+
+    call deter_free(ref1)
+
+  end Subroutine generspin_ref1
+
+
+
+  !$============================================================
+  !> @brief Estimates the nb of ref1 in each category
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param Newref0
+  !> @param nref0
+  !> @param nligo
+  !> @param nact
+  !> @param nligv
+  !> @param nref1cascas
+  !> @param nref1ligocas
+  !> @param nref1casligv
+  !> @param nref1ligoligv
+  !> @param nref1
+  !$============================================================
+  subroutine estimate_nref1(Newref0, nref0, nligo, nact, nligv, &
+       nref1cascas, nref1ligocas, nref1casligv, nref1ligoligv, nref1)
+
+    implicit none
+
+    integer(kindact), dimension(:), allocatable, intent(in) :: NewRef0
+    integer, intent(in) :: nref0, nligo, nact, nligv
+    integer, intent(out) :: nref1cascas, nref1ligocas, nref1casligv, &
+         nref1ligoligv, nref1
+
+    integer  :: n, idet
+    integer  :: torb, porb
+    logical, parameter :: debugcc=.false., debuglc=.false., debugcl=.false., &
+         debugll=.false.
+
+    n = 0
+    !-----------------
+    ! CAS  -> CAS
+    !-----------------
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          if (torb.eq.porb) cycle
+          do idet = 1,Nref0
+             if (btest(NewRef0(idet), torb) .and. &
+                  .not.btest(NewRef0(idet), porb)) n = n + 1
+             if (btest(NewRef0(idet), torb+nact) .and. &
+                  .not.btest(NewRef0(idet), porb+nact)) n = n+1
+          end do
+       end do
+    end do
+    nref1cascas = n
+
+    if(debugcc) then
+       write(f_output,'("  Eval Nbre de det Ref1 CAS -> CAS (debug) :",I8)')  n
+    endif
+
+    !-----------------
+    ! ligo -> CAS
+    !-----------------
+    do porb = 0,nact-1
+       do idet = 1,Nref0
+          if (.not.btest(NewRef0(idet), porb)) n = n + nligo
+          if (.not.btest(NewRef0(idet), porb+nact)) n = n + nligo
+       end do
+    end do
+    nref1ligocas = n - nref1cascas
+
+    if (debuglc) then
+       write(f_output,'("  Eval Nbre de det Ref1 ligo-> CAS (debug) :",I8)')  &
+            nref1LigoCas
+    endif
+
+    !-----------------
+    ! CAS  -> ligv
+    !-----------------
+    do torb = 0,nact-1
+       do idet = 1,Nref0
+          if (btest(NewRef0(idet), torb)) n = n + nligv
+          if (btest(NewRef0(idet), torb+nact)) n = n + nligv
+       end do
+    end do
+    nref1casligv = n - nref1cascas - nref1ligocas
+    if (debugcl) then
+       write(f_output,'("  Eval Nbre de det Ref1 CAS -> ligv (debug) :",I8)') &
+            nref1CasLigv
+    endif
+
+    !-----------------
+    ! ligo -> ligv
+    !-----------------
+    n = n + 2 * nligo * nligv * Nref0
+    nref1ligoligv =  2 * nligo * nligv * Nref0
+    if (debugll) then
+       write(f_output,'("  Eval Nbre de det Ref1 ligo-> ligv (debug) :",I8)') &
+            nref1ligoligv
+    endif
+
+    !-----------------
+    ! ligo -> ligv + echange CAS
+    !-----------------
+    do torb = 0,nact-1
+       do porb = 0,nact-1
+          do idet = 1,Nref0
+             if (btest(NewRef0(idet), torb) .and. &
+                  .not.btest(NewRef0(idet), porb)) n = n + nligo*nligv
+             if (btest(NewRef0(idet), torb) .and. &
+                  .not.btest(NewRef0(idet), porb+nact)) n = n + nligo*nligv
+             if (btest(NewRef0(idet), torb+nact) .and. &
+                  .not.btest(NewRef0(idet), porb)) n = n + nligo*nligv
+             if (btest(NewRef0(idet), torb+nact) .and. &
+                  .not.btest(NewRef0(idet), porb+nact)) n = n + nligo*nligv
+          end do
+       end do
+    end do
+    nref1ligoligv = n - nref1cascas - nref1ligocas - nref1CasLigv
+    if (debugll) then
+       write(f_output,'("  Nbre de det Ref1 ligo-> ligv + ech (debug) :",I8)') &
+            nref1ligoligv
+    endif
+
+    !-----------------
+    ! Total nref1
+    !-----------------
+    Nref1 = n
+    if (debug) then
+       write(f_output,'("  Nbre de det Ref1 (debug) :",I8)')  Nref1
+    endif
+
+  end subroutine estimate_nref1
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
+
+
+
+  !$============================================================
+  !> @brief Generate the CAS-CAS ref1
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param Newref0
+  !> @param nref0
+  !> @param detcascas
+  !> @param nref1cascas
+  !> @param nact
+  !> @param r
+  !$============================================================
+  subroutine gener_ref1cascas(NewRef0, nref0, detcascas, nref1cascas, &
+       nact, r, debugcc)
+
+    implicit none
+
+    integer, intent(inout)                                  :: nref1cascas
+    integer, intent(in)                                     :: nact, nref0
+    integer(kindact), dimension(:), allocatable, intent(in) :: NewRef0
+    type(rlist), intent(inout)                              :: r
+    type(deter), dimension(:), allocatable, intent(out)     :: detCASCAS
+    logical, intent(in)                                     :: debugcc
+
+    integer :: i,n,idet
+    integer(kindtp) :: torb,porb
+    integer(kindact), dimension(:), allocatable :: NewRef1
+    integer(kindact) :: tmpact
+    type(detact_list), pointer :: r01
+
+!!$ Engendrer Det mono-excités CAS  -> CAS
+    allocate(NewRef1(nref1cascas))
+    NewRef1(:) = 0_kindact
+    n = 0
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          if (torb.eq.porb) cycle
+          do idet = 1, nref0
+             if (btest(NewRef0(idet), torb) .and. &
+                  .not.btest(NewRef0(idet), porb)) then 
+                tmpact = ibclr(NewRef0(idet), torb)
+                tmpact = ibset(tmpact,porb)
+                do i = 1,nRef0
+                   if (tmpact.eq.NewRef0(i)) goto 11
+                end do
+                do i = 1,n
+                   if (tmpact.eq.NewRef1(i)) goto 11
+                end do
+                n = n + 1
+                NewRef1(n) = tmpact
+             end if
+11           continue
+          end do
+          !
+          do idet = 1,Nref0
+             if (btest(NewRef0(idet), torb+nact) .and. &
+                  .not.btest(NewRef0(idet), porb+nact)) then 
+                tmpact = ibclr(NewRef0(idet), torb+nact)
+                tmpact = ibset(tmpact,porb+nact)
+                do i = 1,nRef0
+                   if (tmpact.eq.NewRef0(i)) goto 12
+                end do
+                do i = 1,n
+                   if (tmpact.eq.NewRef1(i)) goto 12
+                end do
+                n = n + 1
+                NewRef1(n) = tmpact
+             end if
+12           continue
+          end do
+       end do
+    end do
+    nref1cascas = n
+
+    ! Save the active parts in R_0^1
+    r01 => get_detact(r,0,1)
+    call fill_detact_list(r01, NewRef1, nref1cascas)
+
+    allocate(detCASCAS(nref1cascas))
+    detCasCAS(:)%detact    = 0
+    do i = 1,2
+       detCasCAS(:)%dettr(i)  = 0
+    end do
+    do i = 1,2
+       detCasCAS(:)%detprt(i) = 0
+    end do
+    do idet = 1,n
+       detCASCAS(idet)%detact = NewRef1(idet)
+    end do
+    if (debug) &
+         write(f_output,'("  Nbre de det Ref1 CAS -> CAS :",I8)')  nref1cascas
+    !
+!!$    if (debugcc)  then
+!!$       do i = 1,n
+!!$          tmpact = NewRef1(i)
+!!$          call wrtact(tmpact, f_output, .false.) 
+!!$       end do
+!!$    end if
+    deallocate(NewRef1)
+
+  end subroutine gener_ref1cascas
+
+  !$============================================================
+  !> @brief Generate the ligo-CAS ref1
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param Newref0
+  !> @param nref0
+  !> @param detligocas
+  !> @param nref1ligocas
+  !> @param nact
+  !> @param r
+  !$============================================================
+  subroutine gener_ref1ligocas(NewRef0, nref0, detligocas, nref1ligocas, &
+       nact, nligo, ngel, nocc, nelact, r, debuglc)
+
+    implicit none
+
+    integer, intent(inout)                                  :: nref1ligocas
+    integer, intent(in)                                     :: nact, nref0, &
+         nligo, ngel, nocc, nelact
+    integer(kindact), dimension(:), allocatable, intent(in) :: NewRef0
+    type(rlist), intent(inout)                              :: r
+    type(deter), dimension(:), allocatable, intent(out)     :: detligoCAS
+    logical, intent(in)                                     :: debuglc
+
+    integer :: i, m, n, idet, isft
+    integer(kindtp) :: torb, porb
+    integer(kindact), dimension(:), allocatable :: NewRef1
+    integer(kindact) :: tmpact
+    integer(kd_int) :: nRp10
+    type(detact_list), pointer :: rp10
+
+    ! Engendrer  Det mono-excités ligo -> CAS
+    nRp10 = nref0 * ( 2*nact - nelact )
+    m = 1
+    allocate(NewRef1(nRp10))
+    NewRef1(:) = 0_kindact
+    
+    !If there is no ligo, generate the active determinants Rp10 and exit
+    if (nligo.eq.0) then
+       !write(*,*) 'Generates R_1^0'
+       nref1ligocas = 0
+       do porb = 0,nact-1
+          do idet = 1,Nref0
+             if (.not.btest(NewRef0(idet), porb)) then 
+                tmpact = ibset(NewRef0(idet), porb)
+                !call  wrtact(tmpact, 6, .false., nact)  
+                NewRef1(m) = tmpact
+                m = m+1
+             end if
+          end do
+          do idet = 1,Nref0
+             if (.not.btest(NewRef0(idet), porb+nact)) then 
+                tmpact = ibset(NewRef0(idet), porb+nact)
+                !call  wrtact(tmpact, 6, .false., nact) 
+                NewRef1(m) = tmpact
+                m = m+1
+             end if
+          end do
+       end do
+       !Generate the ref1ligocas and the Rp10      
+    else
+       allocate(detligoCAS(nref1ligocas))
+       detligoCAS(:)%detact    = 0
+       do i = 1,2
+          detligoCAS(:)%dettr(i)  = 0
+       end do
+       do i = 1,2
+          detligoCAS(:)%detprt(i) = 0
+       end do
+       isft = 2*ngel + nocc
+       n = 0
+       do torb = 1+isft, nligo+isft
+          do porb = 0,nact-1
+             do idet = 1,Nref0
+                if (.not.btest(NewRef0(idet), porb)) then 
+                   tmpact = ibset(NewRef0(idet), porb)
+                   if (torb .eq. 1+isft) then
+                      NewRef1(m) = tmpact
+                      m = m+1
+                   endif
+                   do i = 1,n
+                      if (tmpact.eq.detLigoCAS(i)%detact .and. &
+                           torb .eq.detLigoCAS(i)%dettr(1)) goto 21
+                   end do
+                   n = n+1
+                   detLigoCAS(n)%detact = tmpact
+                   detLigoCAS(n)%dettr(1) = torb
+                end if
+21              continue
+             end do
+             do idet = 1,Nref0
+                if (.not.btest(NewRef0(idet), porb+nact)) then 
+                   tmpact = ibset(NewRef0(idet), porb+nact)
+                   if (torb .eq. 1+isft) then
+                      NewRef1(m) = tmpact
+                      m = m+1
+                   endif
+                   do i = 1,n
+                      if (tmpact.eq.detLigoCAS(i)%detact .and. &
+                           torb + nocc + nligo .eq.detLigoCAS(i)%dettr(1)) goto 22
+                   end do
+                   n = n+1
+                   detLigoCAS(n)%detact = tmpact
+                   detLigoCAS(n)%dettr(1) = torb + nocc + nligo
+                end if
+22              continue
+             end do
+          end do
+       end do
+       nref1ligocas = n
+    endif
+    if (debug) &
+         write(f_output,'("  Nbre de det Ref1 ligo-> CAS :",I8)')  nref1LigoCas
+    
+    
+    ! Save the active parts in R_1^0
+    rp10 => get_detact(r, 1 ,0)
+    
+    call fill_detact_list(rp10, NewRef1, m-1)
+    deallocate(NewRef1)
+    
+  end subroutine gener_ref1ligocas
+
+
+  !$============================================================
+  !> @brief Generate the CAS-ligv ref1
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param Newref0
+  !> @param nref0
+  !> @param detcasligv
+  !> @param nref1casligv
+  !> @param nact
+  !> @param r
+  !$============================================================
+  subroutine gener_ref1casligv(NewRef0, nref0, detcasligv, nref1casligv, &
+       nact, ngel, nocc, nligo, nligv, nvirt, nelact, r, debugcl)
+
+    implicit none
+
+    integer, intent(inout)                                  :: nref1casligv
+    integer, intent(in)                                     :: nact, nref0, &
+         nligo, ngel, nocc, nelact, nligv, nvirt
+    integer(kindact), dimension(:), allocatable, intent(in) :: NewRef0
+    type(rlist), intent(inout)                              :: r
+    type(deter), dimension(:), allocatable, intent(out)     :: detCASligv
+    logical, intent(in)                                     :: debugcl
+
+    integer :: i, m, n, idet, isft
+    integer(kindtp) :: torb, porb
+    integer(kindact), dimension(:), allocatable :: NewRef1
+    integer(kindact) :: tmpact
+    integer(kd_int) :: nRm10
+    type(detact_list), pointer :: rm10
+
+    nRm10 = nref0 * nelact 
+    allocate(NewRef1(nRm10))
+    NewRef1(:) = 0_kindact
+    
+    m = 1
+    
+    if (nligv .eq. 0) then
+       nref1casligv = 0
+
+       do torb = 0,nact-1
+          do idet = 1,Nref0
+             if (btest(NewRef0(idet), torb)) then
+                tmpact = ibclr(NewRef0(idet), torb)
+                NewRef1(m) = tmpact
+                m = m+1
+             endif
+          end do
+          do idet = 1,Nref0
+             if (btest(NewRef0(idet), torb+nact)) then 
+                tmpact = ibclr(NewRef0(idet), torb+nact)
+                NewRef1(m) = tmpact
+                m = m+1
+             end if
+          end do
+       end do
+       
+    else
+
+       allocate(detCasLigv(nref1CasLigv))
+       detCasLigv(:)%detact    = 0
+       do i = 1,2
+          detCasLigv(:)%dettr(i)  = 0
+       end do
+       do i = 1,2
+          detCasLigv(:)%detprt(i) = 0
+       end do
+       isft = 2*ngel + 2*nocc + 2*nligo + 2*nact
+       n = 0
+       do porb = 1+isft, nligv+isft
+          do torb = 0,nact-1
+             do idet = 1,Nref0
+                if (btest(NewRef0(idet), torb)) then
+                   tmpact = ibclr(NewRef0(idet), torb)
+                   do i = 1,n
+                      if (tmpact.eq.detCASLigv(i)%detact .and. &
+                           porb .eq.detCASLigv(i)%detprt(1)) goto 31
+                   end do
+                   if (porb .eq. 1+isft) then
+                      NewRef1(m) = tmpact
+                      m = m+1
+                   endif
+                   n = n+1
+                   detCasLigv(n)%detact = tmpact
+                   detCasLigv(n)%detprt(1) = porb
+                end if
+31              continue
+             end do
+             do idet = 1,Nref0
+                if (btest(NewRef0(idet), torb+nact)) then 
+                   tmpact = ibclr(NewRef0(idet), torb+nact)
+                   do i = 1,n
+                      if (tmpact.eq.detCASLigv(i)%detact .and. &
+                           porb + nligv + nvirt .eq.detCASLigv(i)%detprt(1)) goto 32
+                   end do
+                   if (porb .eq. 1+isft) then
+                      NewRef1(m) = tmpact
+                      m = m+1
+                   endif
+                   n = n+1
+                   detCasLigv(n)%detact = tmpact
+                   detCasLigv(n)%detprt(1) = porb + nligv + nvirt
+                end if
+32              continue
+             end do
+          end do
+       end do
+       nref1casligv = n 
+    endif
+    !
+    ! Save the active parts in R_{-1}^0
+    rm10 => get_detact(r, -1,0)
+    
+    call fill_detact_list(rm10, NewRef1, m-1)
+    
+    deallocate(NewRef1)
+
+    if (debug) &
+         write(f_output,'("  Nbre de det Ref1 CAS -> ligv:",I8)')  nref1CasLigv
+
+   
+  end subroutine gener_ref1casligv
+
+
+  !$============================================================
+  !> @brief Generate the ligo-ligv (+exchange CAS) ref1
+  !> @author MB Lepetit
+  !> @date 2017
+  !>
+  !> @param Newref0
+  !> @param nref0
+  !> @param detcasligv
+  !> @param nref1casligv
+  !> @param nact
+  !> @param r
+  !$============================================================
+  subroutine gener_ref1ligoligv(NewRef0, nref0, detligoligv, nref1ligoligv, &
+       nact, ngel, nocc, nligo, nligv, nvirt, nelact, r, debugll)
+
+    use utils_det
+
+    implicit none
+
+    integer, intent(inout)                                  :: nref1ligoligv
+    integer, intent(in)                                     :: nact, nref0, &
+         nligo, ngel, nocc, nelact, nligv, nvirt
+    integer(kindact), dimension(:), allocatable, intent(in) :: NewRef0
+    type(deter), dimension(:), allocatable, intent(out)     :: detligoligv
+    type(rlist), intent(inout)                              :: r
+    logical, intent(in)                                     :: debugll
+
+    integer :: i, m, n, torbc, porbc, idet
+    integer(kindtp) :: torb, porb, isft, isft1
+    integer(kindact), dimension(:), allocatable :: tmpExc
+    integer(kindact) :: tmpact
+    type(deter) :: tmpdet
+    type(detact_list),pointer :: r01
+    type(detact_list) :: rtmp
+
+    !> @todo ligo or ligv = 0
+
+    if ((nligo .eq. 0) .or. (nligv .eq. 0)) then 
+       nref1LigoLigv = 0
+    else
+       ! Engendrer  Det mono-excités  ligo  -> ligv
+       allocate(detLigoLigv(nref1LigoLigv))
+       detLigoLigv(:)%detact    = 0
+       do i = 1,2
+          detLigoLigv(:)%dettr(i)  = 0
+       end do
+       do i = 1,2
+          detLigoLigv(:)%detprt(i) = 0
+       end do
+       isft = 2*ngel + nocc
+       isft1 = 2*ngel + 2*nocc + 2*nligo + 2*nact
+       n = 0
+       do torb = 1+isft, nligo+isft
+          do porb = 1+isft1, nligv+isft1
+             do idet = 1,Nref0
+                n = n + 1
+                detLigoLigv(n)%detact =  NewRef0(idet) 
+                detLigoLigv(n)%dettr(1)  = torb
+                detLigoLigv(n)%detprt(1) = porb
+             end do
+             do idet = 1,Nref0
+                n = n + 1
+                detLigoLigv(n)%detact =  NewRef0(idet) 
+                detLigoLigv(n)%dettr(1)  = torb + nocc + nligo
+                detLigoLigv(n)%detprt(1) = porb + nligv + nvirt
+             end do
+          end do
+       end do
+       nref1ligoligv = n 
+       if (debug) &
+            write(f_output,'("  Nbre de det Ref1 ligo-> ligv:",I8)')  nref1LigoLigv
+
+
+!!$ Engendrer  Det mono-excités  ligo  -> ligv + echange CAS
+       isft = 2*ngel + nocc
+       isft1 = 2*ngel + 2*nocc + 2*nligo + 2*nact
+       do torb = 1+isft, nligo+isft
+          do porb = 1+isft1, nligv+isft1
+             do torbc = 0, nact-1
+                do porbc = 0,nact-1
+                   ! up up
+                   do idet = 1,Nref0
+                      if (btest(NewRef0(idet), torbc) .and. &
+                           .not.btest(NewRef0(idet), porbc)) then 
+                         call detzero(tmpdet)
+                         tmpact = ibclr(NewRef0(idet), torbc)
+                         tmpact = ibset(tmpact,porbc)
+                         tmpdet%detact = tmpact
+                         tmpdet%dettr(1)  = torb
+                         tmpdet%detprt(1) = porb
+                         do i = 1,n
+                            if (deteq(tmpdet,detLigoLigv(i))) goto 41
+                         end do
+                         n = n + 1
+                         detLigoLigv(n) = tmpdet
+                      end if
+41                    continue
+                   end do
+                    ! dn dn
+                   do idet = 1,Nref0
+                      if (btest(NewRef0(idet), torbc+nact) .and. &
+                           .not.btest(NewRef0(idet), porbc+nact)) then 
+                         call detzero(tmpdet)
+                         tmpact = ibclr(NewRef0(idet), torbc+nact)
+                         tmpact = ibset(tmpact,porbc+nact)
+                         tmpdet%detact = tmpact
+                         tmpdet%dettr(1)  = torb + nocc + nligo
+                         tmpdet%detprt(1) = porb + nligv + nvirt
+                         do i = 1,n
+                            if (deteq(tmpdet, detLigoLigv(i))) goto 44
+                         end do
+                         n = n + 1
+                         detLigoLigv(n) = tmpdet
+                      end if
+44                    continue
+                   end do
+                   ! dn up
+                   do idet = 1,Nref0
+                      if (btest(NewRef0(idet), torbc) .and. &
+                           .not.btest(NewRef0(idet), porbc+nact)) then 
+                         call detzero(tmpdet)
+                         tmpact = ibclr(NewRef0(idet), torbc)
+                         tmpact = ibset(tmpact,porbc+nact)
+                         tmpdet%detact = tmpact
+                         tmpdet%dettr(1)  = torb + nocc + nligo
+                         tmpdet%detprt(1) = porb
+                         do i = 1,n
+                            if (deteq(tmpdet, detLigoLigv(i))) goto 43
+                         end do
+                         n = n + 1
+                         detLigoLigv(n) = tmpdet
+                      end if
+43                    continue
+                   end do
+                   ! up dn
+                   do idet = 1,Nref0
+                      if (btest(NewRef0(idet), torbc+nact) .and. &
+                           .not.btest(NewRef0(idet), porbc)) then 
+                         call detzero(tmpdet)
+                         tmpact = ibclr(NewRef0(idet), torbc+nact)
+                         tmpact = ibset(tmpact,porbc)
+                         tmpdet%detact = tmpact
+                         tmpdet%dettr(1)  = torb
+                         tmpdet%detprt(1) = porb + nligv + nvirt
+                         do i = 1,n
+                            if (deteq(tmpdet, detLigoLigv(i))) goto 42
+                         end do
+                         n = n + 1
+                         detLigoLigv(n) = tmpdet
+                      end if
+42                    continue
+                   end do
+                end do
+             end do
+          end do
+       end do
+       write(f_output,'("  Nbre de det Ref1 ligo-> ligv + ech :",I8)')  n-nref1LigoLigv
+
+
+       nref1ligoligv = n
+    endif
+    if (debug) &
+         write(f_output,'("  Nbre de det Ref1 ligo-> ligv tot:",I8)')  nref1LigoLigv
+  end subroutine gener_ref1ligoligv
+end module gener_ref1
diff --git a/src/screening.F90 b/src/screening.F90
new file mode 100644
index 0000000000000000000000000000000000000000..30d4469a4000c9cf7d25ff635e59257f11d4b915
--- /dev/null
+++ b/src/screening.F90
@@ -0,0 +1,299 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module gener_monos
+
+  use info
+  use dimensions
+  use detact
+  use utils_det
+  use utils_wrt
+  use gener_det
+
+  implicit none
+
+contains
+
+  !$============================================================
+  !> @brief Generates all screening configurations
+  !> @author Marie
+  !> @date 16-10-2017
+  !> @param d List of all determinants by block
+  !> @param rspin Active part of determinants
+  !> @param det_info Information on the determinants
+  !> @param o_info Information on the orbitals
+  !> @param v_info
+  !> @param prog_info
+  !$------------------------------------------------------------
+  subroutine generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, lkeep)
+
+    type(deter_dblocklist), intent(inout)               :: d
+    type(spinrlist), intent(in)                         :: rspin
+    type(o_infotype), intent(in)                        :: o_info
+    type(v_infotype), intent(in)                        :: v_info
+    type(det_infotype), intent(inout)                   :: det_info
+    type(prog_infotype), intent(in)                     :: prog_info
+    logical, intent(in)                                 :: lkeep
+
+    integer :: i   
+    type(deter), dimension(:), allocatable:: det
+    real(kd_dble) :: tstart, wstart, tend, wend 
+
+    do i = 1, d%nblock
+       if (prog_info%nodet_block(i)) then
+          write(f_output,'(A,I0,A)') '  >>> Determinant block D',&
+                  d%deter_index(i),&
+                  ' was turned off by nodet_block input keyword'
+          flush(f_output)
+       else
+          if ((i.eq.3) .and. (prog_info%methodExc .eq. 'ddci')) then
+             if (prog_info%id_cpu.eq.0) then
+                write(f_output,'(A,I0,A)') '  >>> Determinant block D',&
+                     d%deter_index(i),&
+                     ' not generated for DDCI calculation'
+                flush(f_output)
+             endif
+          else
+             call gettime(tstart, wstart)
+             call gener_totdet(d%deter_index(i),&
+                  rspin, det_info, o_info, v_info%sz, d, prog_info, lkeep)
+             call gettime(tend, wend)
+             if (prog_info%id_cpu.eq.0) then
+                write(f_output,'(A,I0,A,F8.2,A)') '  >>> Determinant block D',&
+                     d%deter_index(i),&
+                     ' generated in ',tend-tstart,' second(s)'
+                flush(f_output)   
+             endif
+          endif
+       endif
+    enddo
+    call count_det(d, det_info)
+
+    if (prog_info%id_cpu.eq.0) then
+       write(f_output,'(A25,36X,I10)') &
+            "  Total Nb of determinants = ", det_info%ndet
+       flush(f_output)
+    
+       if (prog_info%print_det) then
+          write(f_output,*) 'Printing determinants to file.det'
+          call deter_init(det, det_info%ndet)
+          call fill_detd(det, d)
+          do i =1,det_info%ndet
+             write(f_det,'(1x,i10,": ")',advance="no") i
+             call wrtdet(det(i), f_det, o_info)
+          enddo
+          call deter_free(det)
+          flush(f_det)
+       endif
+    endif
+    
+    
+  end Subroutine generspin_det
+
+  !$============================================================
+  !> @brief Count the total number of determinants in the D blocks
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !
+  !> @param d List of all Dblocks
+  !> @param det_info Information on the determinants
+  !$------------------------------------------------------------ 
+  subroutine count_det(d, det_info)
+    
+    type(deter_dblocklist) :: d
+    type(det_infotype) :: det_info
+
+    integer :: ndet, indx
+    type(deter_dblock), pointer :: dblock
+    
+    ndet = 0
+    do indx = 1, d%nblock
+       dblock => d%detblock(indx)%p
+       dblock%shift = ndet
+       ndet = ndet + dblock%ndet
+    enddo
+
+    det_info%ndet = ndet
+
+  end subroutine count_det
+
+  !$============================================================
+  !> @brief fill the det with all determinants in the D blocks
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !
+  !> @param det All determinants (ref0,ref1 and screening)
+  !> @param d List of all Dblocks
+  !> @param det_info Information on the determinants
+  !$------------------------------------------------------------ 
+  subroutine fill_detd(det, d)
+    
+    type(deter), dimension(:), allocatable, intent(inout) :: det
+    type(deter_dblocklist) :: d
+
+    integer :: indx, sft
+    type(deter_dblock), pointer :: dblock
+       
+    sft = 0
+    do indx = 1, d%nblock
+       dblock => d%detblock(indx)%p
+       
+       if (dblock%ndet .ne. 0) then
+          det(sft + 1: sft + dblock%ndet) = dblock%elms(:)
+       endif
+       dblock%shift = sft
+       sft = sft + dblock%ndet
+    enddo
+    
+  end subroutine fill_detd
+  
+  
+  !$============================================================
+  !> @brief Estimates the number of screened det for allocation
+  !> @author Marie
+  !> @date 16-10-2017
+  !> @param n Number of screened determinants
+  !> @param nocc Number of occupied orbitals
+  !> @param nligo Number of occupied ligand orbitals
+  !> @param nact Number of active orbitals
+  !> @param nligv Number of virtual ligand orbitals
+  !> @param nvirt Number of virtual orbitals
+  !> @param det_info Information on determinants
+  !> @param Active parts of determinants 
+  !$------------------------------------------------------------
+  subroutine count_monos(n, nocc, nligo, nact, nligv, nvirt, det_info, r)
+
+    implicit none
+
+    integer, intent(out) :: n
+    integer, intent(in)  :: nocc, nligo, nact, nligv, nvirt
+    type(det_infotype), intent(in) :: det_info
+    type(rlist), intent(in) :: r
+
+    integer :: nref0, nref1
+    integer :: nref1cascas, nref1ligocas, nref1casligv, nref1ligoligv
+    integer :: isft, torb, porb, idet
+    type(detact_list), pointer :: r01
+    integer(kindact), dimension(:), pointer :: NewRef1
+
+    nref0 = det_info%nref0
+    nref1 = det_info%nref1
+    nref1cascas = det_info%nref1cascas
+    nref1ligocas = det_info%nref1ligocas
+    nref1casligv = det_info%nref1casligv
+    nref1ligoligv = det_info%nref1ligoligv
+    
+    ! Ref1CASCAS
+    r01 => get_detact(r,0,1)
+    newref1 => r01%elms(:)
+
+    ! Compter (approximativement) pour allocate
+    n  = 0
+    ! T0
+    ! 0000 = occ, ligo, ligv, virt 
+    isft = 0
+    do torb = 0, nact-1
+       do porb = 0,nact-1
+          if (torb.eq.porb) cycle
+          do idet = 1+isft , NRef1cascas+isft
+             if (btest(NewRef1(idet), torb) .and. &
+                  .not.btest(NewRef1(idet), porb)) n = n + 1
+             if (btest(NewRef1(idet), torb+nact) .and. &
+                  .not.btest(NewRef1(idet), porb+nact)) n = n+1
+          end do
+       end do
+    end do
+    ! 0110
+    n = n +    2 * nLigo * nLigv * nRef1CasCas * (1+2*nact*nact)
+    ! 0101
+    n = n +    2 * nLigo * nVirt * nRef0 * (1 + 2**nact*nact) &
+         +    2 * nLigo * nVirt * nRef1CasCas * (1+2*nact*nact) &
+         +    2 * nact  * nVirt * nRef1LigoCas
+    ! 1010
+    n = n +    2 * nOcc  * nLigv * nRef0 * (1 + 2*nact*nact) &
+         +    2 * nOcc  * nLigv * nRef1CasCas * (1+2*nact*nact) &
+         +    2 * nOcc  * nact  * nRef1CasLigv
+    ! 1001 
+    n = n +    2 * nOcc  * nVirt * nRef0 * (1 + 2*nact*nact) &
+         +    2 * nOcc  * nVirt * nRef1CasCas * (1+2*nact*nact) 
+    ! 0220 
+    n = n +    2 * nLigo * nLigv * nRef1ligoligv * (1+2*nact*nact)
+    ! 0211
+    n = n +    2 * nLigo * nVirt * nRef1LigoLigv * (1+2*nact*nact)
+    ! 1120
+    n = n +    2 * nOcc  * nLigv * nRef1LigoLigv * (1+2*nact*nact)
+    ! 1111
+    n = n +    2 * nOcc  * nVirt * nRef1LigoLigv * (1+2*nact*nact)
+    ! T1
+    ! 0100
+    n = n +    2 * nLigo * nact  * nRef1cascas
+    ! 1000
+    n = n +    2 * nOcc  * nact * nRef0 &
+         +    2 * nOcc  * nact * nRef1cascas 
+    ! 0210
+    n = n +    2 * nLigo * nLigv * nRef1LigoCas * (1+2*nact*nact)
+    ! 0201
+    n = n +    2 * nLigo * nVirt * nRef1LigoCas * (1+2*nact*nact) 
+    ! 1110
+    n = n +    2 * nOcc  * nLigv * nRef1LigoCas * (1+2*nact*nact) &
+         +    2 * nOcc  * nact  * nRef1LigoLigv
+    ! 1101
+    n = n +    2 * nOcc  * nVirt * nRef1LigoCas * (1+2*nact*nact)
+    !T-1
+    ! 0010
+    n = n +    2 * nact  * nLigv * nRef1cascas
+    ! 0001
+    n = n +    2 * nact  * nVirt * nRef0 &
+         +    2 * nact  * nVirt * nRef1cascas
+    ! 0120
+    n = n +    2 * nLigo * nLigv * nRef1CasLigv * (1+2*nact*nact)
+    ! 1020
+    n = n +    2 * nOcc  * nLigv * nRef1CasLigv * (1+2*nact*nact)
+    ! 0111
+    n = n +    2 * nLigo * nVirt * nRef1CasLigv * (1+2*nact*nact) &
+         +    2 * nact  * nVirt * nRef1LigoLigv 
+    ! 1011
+    n = n +    2 * nOcc  * nVirt * nRef1CasLigv * (1+2*nact*nact)
+    !T2
+    ! 0200
+    n = n +    2 * nLigo * nact  * nRef1Ligocas
+    ! 1100
+    n = n +    2 * nOcc  * nact  * nRef1LigoCas
+    !T-2
+    ! 0020
+    n = n +    2 * nact  * nLigv * nRef1CasLigv
+    ! 0011
+    n = n +    2 * nact  * nVirt * nRef1CasLigv
+
+    write(f_output,*) ''
+
+  end subroutine count_monos
+
+end module gener_monos
diff --git a/src/sort.F90 b/src/sort.F90
new file mode 100644
index 0000000000000000000000000000000000000000..6b45f41dbed98f947dbfe33619874890caad48c9
--- /dev/null
+++ b/src/sort.F90
@@ -0,0 +1,156 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module sort
+
+  use info
+
+  implicit none
+
+contains
+  !---------------------------------------------------------------------
+  !> @brief sort an array data(1:n) into descending order using heapsort algorithm,
+  !> and considering two elements being equal if their values differ
+  !> for less than "eps".
+  !>
+  !> n is input, data is replaced on output by its sorted rearrangement.
+  !> create an index table (indx) by making an exchange in the index array
+  !> whenever an exchange is made on the sorted data array (data).
+  !>
+  !> in case of equal values in the data array (data) the values in the
+  !> index array (indx) are used to order the entries.
+  !> if on input indx(1)  = 0 then indices are initialized in the routine,
+  !> if on input indx(1) != 0 then indices are assumed to have been
+  !>                initialized before entering the routine and these
+  !>                indices are carried around during the sorting process
+  !>
+  !> adapted from Numerical Recipes pg. 329 (new edition)
+  !>
+  !>
+  !>
+  subroutine hpsort_eps_epw (n, data, indx, eps)
+
+    !-input/output variables
+    integer, intent(in)        :: n  
+    real(kd_dble), intent(in)  :: eps
+    integer                    :: indx (n)  
+    real(kd_dble)              :: data (n)
+
+    !-local variables
+    integer        :: i, ir, j, l, iind  
+    real(kd_dble)  :: rra  
+    !
+    ! initialize index array
+    if (indx (1) .eq. 0) then  
+       do i = 1, n  
+          indx (i) = i  
+       end do
+    end if
+
+    ! nothing to order
+    IF (n.lt.2) return  
+    ! initialize indices for hiring and retirement-promotion phase
+    l = n / 2 + 1  
+
+    ir = n  
+
+    sorting: do 
+
+       ! still in hiring phase
+       IF ( l .gt. 1 ) then  
+          l    = l - 1  
+          rra  = data (l)  
+          iind = indx (l)  
+          ! in retirement-promotion phase.
+       ELSE  
+          ! clear a space at the end of the array
+          rra  = data (ir)  
+          !
+          iind = indx (ir)  
+          ! retire the top of the heap into it
+          data (ir) = data (1)  
+          !
+          indx (ir) = indx (1)  
+          ! decrease the size of the corporation
+          ir = ir - 1  
+          ! done with the last promotion
+          IF ( ir .eq. 1 ) then  
+             ! the least competent worker at all !
+             data (1)  = rra  
+             !
+             indx (1) = iind  
+             exit sorting  
+          ENDIF
+       ENDIF
+       ! wheter in hiring or promotion phase, we
+       i = l  
+       ! set up to place rra in its proper level
+       j = l + l  
+       !
+       DO while ( j .le. ir )  
+          IF ( j .lt. ir ) then  
+             ! compare to better underling
+             IF ( hslt( data (j),  data (j + 1) ) ) then  
+                j = j + 1  
+             ENDIF
+          ENDIF
+          ! demote rra
+          IF ( hslt( rra, data (j) ) ) then  
+             data (i) = data (j)  
+             indx (i) = indx (j)  
+             i = j  
+             j = j + j  
+          ELSE
+             ! set j to terminate do-while loop
+             j = ir + 1  
+          ENDIF
+       ENDDO
+       data (i) = rra  
+       indx (i) = iind  
+
+    END DO sorting
+
+
+  contains
+ 
+    !  compare two real number and return the result
+    
+    logical function hslt( a, b )
+      
+      REAL(kd_dble) :: a, b
+      IF( abs(a-b) <  eps ) then
+         hslt = .false.
+      ELSE
+         hslt = ( a > b )
+      end if
+    end function hslt
+    !
+  end subroutine hpsort_eps_epw
+
+end module sort
diff --git a/src/spindetact.F90 b/src/spindetact.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7f4c6288f420126aa0ffbe52209bc9405c4b5143
--- /dev/null
+++ b/src/spindetact.F90
@@ -0,0 +1,814 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+module spindetact
+
+  use info
+  use detact
+  use dimensions 
+  use files
+  use typedet
+  use utils_wrt
+  use utils_bits
+  use vec_storage
+
+  implicit none
+
+  interface extract_detCMorb
+     module procedure extract_detCMorb_diff, extract_detCMorb_andIJ, &
+          extract_detCMorb_diffgen, extract_detCMorb_andIJgen
+  end interface extract_detCMorb
+  
+  !$====================================================================
+  !> @brief Type for spin-ordered lists of active parts of determinants
+  !$====================================================================
+  type, public  :: spindetact_list
+     !> @brief NelCAS Number of additional electrons in the active space
+     integer :: NelCAS
+     !> @brief NdetCAS number of determinants in the category
+     integer :: NdetCAS
+     !> @brief Nb of spin categories
+     integer :: NspinCat
+     !> @brief Values of Delta spin in the different categories
+     integer, allocatable :: SpinCat(:)
+     !> @brief Number of detact in each spin category
+     integer, allocatable :: NdetSpinCat(:)
+     !> @brief Shift for each category
+     integer, allocatable :: ShiftSpinCat(:)
+     !> @brief Nb_rlist
+     integer :: nb_rlist = 5
+     !> @brief elms Array of active part of determinants in the category
+     integer(kind=kindact), pointer :: elms(:)
+     !> @brief connect1
+     type(intvecvec), pointer :: connect1(:)
+     !> @brief connect1orb
+     type(connectvecvec), pointer :: connect1orb(:)
+     !> @brief connect2
+     type(intvecvec), pointer :: connect2(:)
+     !> @brief connect1orb
+     type(connectvecvec), pointer :: connect2orb(:)
+     
+  end type spindetact_list
+
+  type, public :: spindetact_listp
+     type(spindetact_list), pointer :: p
+  end type spindetact_listp
+
+  type, public :: spinrlist
+     !> @brief Storage unit for all R_M^N lists
+     type(spindetact_listp), dimension(:), allocatable :: l
+     integer :: nb_rlist = 5
+  end type spinrlist
+  
+contains
+
+  !$====================================================================
+  !> @brief Return the indx corresponding to a nb of CAS electrons 
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param[in] name 
+  !> @return indx the Storage index in the R list
+  !$====================================================================
+  function get_Rspinindx(name) result(indx)
+
+    implicit none
+
+    integer, intent(in) :: name
+    integer :: indx
+    
+    select case(name)
+    case (0)
+       indx = 1
+    case (1)
+       indx = 2
+    case (-1)
+       indx = 3
+    case (2)
+       indx = 4
+    case (-2)
+       indx = 5
+    end select
+  end function get_Rspinindx
+
+  !$====================================================================
+  !> @brief Return the indx corresponding to a given spin in the list SpinCAt
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param sdlist Spindetact list
+  !> @param spin Spin value 
+  !> @return indx the Storage index in the SpinCat list, 0 if not found
+  !$====================================================================
+  function get_spinCatindx(sdlist,spin) result(indx)
+
+    implicit none
+
+    type(spindetact_list), intent(in) :: sdlist
+    integer, intent(in) :: spin
+
+    integer :: indx
+    integer :: i
+
+    indx = 0
+    do i=1,sdlist%NspinCat
+       if (sdlist%Spincat(i) .eq. spin) indx = i
+    enddo
+       
+  end function get_spinCatindx
+  
+  !$====================================================================
+  !> @brief Compute all spin-ordered active determinant lists R_M
+  !! from the active determinants lists 
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param[inout] rspin List of all Spindetact lists
+  !> @param[inout] r List of all detact lists
+  !> @param[in] o_info Orbital info
+  !> @param[in] sz spin of the ref0 configurations
+  !$====================================================================
+  subroutine compute_all_spindetact(rspin, r, o_info, sz)
+
+    type(spinrlist), intent(inout) :: rspin
+    type(rlist), intent(inout)     :: r
+    type(o_infotype), intent(in)   :: o_info
+    integer, intent(in)            :: sz
+
+    type(spindetact_list), pointer :: spinri
+    type(detact_list), pointer :: ri
+    integer :: i
+    
+    call compute_all_detact(r, o_info)
+    call spindetact_all_init(rspin, r, o_info%nact, sz)
+    call spindetact_all_connect(rspin, o_info)
+    
+
+  end subroutine compute_all_spindetact
+    
+  !$====================================================================
+  !> @brief Initialize all spin-ordered active determinant lists R_M
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !
+  !> @param[inout] rspin List of all Spindetact lists
+  !> @param[inout] r List of all detact lists
+  !> @param[in] nact Number of active orbitals
+  !> @param[in] sz spin of the ref0 configurations
+  !$====================================================================
+  subroutine spindetact_all_init(rspin, r, nact, sz)
+    
+    implicit none
+
+    type(spinrlist), intent(inout) :: rspin
+    type(rlist), intent(in)        :: r
+    integer, intent(in)            :: nact, sz
+
+    integer :: nelCAS
+
+    allocate(rspin%l(rspin%nb_rlist))
+
+    do nelCAS = -2,2
+       call spindetact_listp_init(rspin, r, nelCAS, nact, sz)
+    enddo
+  end subroutine spindetact_all_init
+
+  !$====================================================================
+  !> @brief Initialize storage for a list of spin-oredered active det
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[inout] rspin List of all Spindetact lists
+  !> @param[inout] r List of all detact lists
+  !> @param[in] NelCAS Number of additional CAS electrons
+  !> @param[in] nact Number of active orbitals
+  !> @param[in] sz spin of the ref0 configurations
+  !$====================================================================
+  subroutine spindetact_listp_init(rspin, r, NelCAS, nact, sz)
+    
+    implicit none
+    
+    type(spinrlist), intent(inout) :: rspin
+    type(rlist), intent(in)        :: r
+    integer, intent(in)            :: NelCAS, nact, sz
+    
+    integer :: indx
+    
+    ! Consistency check
+    if ((NelCAS .lt. -2) .or. (NelCAS .gt. 2)) then
+       write(f_output,*) 'Incorrect number of additional active electrons', NelCAS
+       call SASS_quit('error nelCAS',f_output)
+    endif
+
+    indx = get_Rspinindx(nelCAS)
+    nullify(rspin%l(indx)%p)
+    allocate(rspin%l(indx)%p)
+    
+    ! Initialization
+    call spindetact_list_init(rspin%l(indx)%p, r, nelCAS, nact, sz)
+    
+  end subroutine spindetact_listp_init
+
+  
+  !$====================================================================
+  !> @brief Free all spin-ordered active determinant lists R_M
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[inout] rspin List of all Spindetact lists
+  !$====================================================================
+  subroutine spindetact_all_free(rspin)
+
+    implicit none
+
+    type(spinrlist), intent(inout) :: rspin
+
+    integer :: i
+    
+    do i = 1, rspin%nb_rlist
+       call spindetact_listp_free(rspin%l(i))
+    enddo
+
+    deallocate(rspin%l)
+    
+  end subroutine spindetact_all_free
+
+
+  !$====================================================================
+  !> @brief Free a type(spindetact_listp) object
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[inout] dcat active determinant list to be freed
+  !$==================================================================== 
+  subroutine spindetact_listp_free(dcat)
+
+    implicit none
+
+    type(spindetact_listp), intent(inout) :: dcat
+
+    call spindetact_list_free(dcat%p)
+    deallocate(dcat%p)
+    
+  end subroutine spindetact_listp_free
+
+  
+  !$===================================================================
+  !> @brief Initialize a spindetact_list from the detact lists r
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[out] sdlist spindetact_list to be created
+  !> @param[in] r list of detact_list
+  !> @param[in] nel nb of additional electrons in the CAS
+  !> @param[in] nact Number of active orbitals
+  !> @param[in] sz Spin of the ref0 configurations
+  !$==================================================================
+  subroutine spindetact_list_init(sdlist, r, nel, nact, sz)
+
+    type(spindetact_list), intent(out) :: sdlist
+    type(rlist), intent(in)            :: r
+    integer, intent(in)                :: Nel, nact, sz
+    
+    integer :: nexc, isft, idetact, i, nspin, spin
+    type(detact_list), pointer :: rexc
+    integer(kindact), allocatable :: tmp1(:), tmp2(:)
+    integer :: NmaxExc
+
+    NmaxExc = 2 - abs(nel)
+    sdlist%nelCAS = nel
+    sdlist%NspinCat= 5 - abs(nel)
+    
+    nullify(sdlist%elms)
+    nullify(sdlist%connect1)
+    nullify(sdlist%connect2)
+    allocate(sdlist%connect1(sdlist%nb_rlist))
+    allocate(sdlist%connect2(sdlist%nb_rlist))
+    do i = 1, sdlist%nb_rlist
+       call vec_init(sdlist%connect1(i),0)
+       call vec_init(sdlist%connect2(i),0)
+    enddo
+
+    nullify(sdlist%connect1orb)
+    nullify(sdlist%connect2orb)
+    allocate(sdlist%connect1orb(sdlist%nb_rlist))
+    allocate(sdlist%connect2orb(sdlist%nb_rlist))
+    
+    !Values of the spin in the different categories
+    allocate(sdlist%SpinCat(sdlist%NspinCat))
+    select case (abs(nel))
+    case (0)
+       sdlist%SpinCat = (/ 0, 2 , -2, 4 ,-4 /)
+    case (1)
+       sdlist%SpinCat = (/ 1, -1, 3, -3 /)
+    case (2)
+       sdlist%SpinCat = (/ 0, 2 , -2 /)
+    end select
+
+        
+    !Initialise the number of determinants in each spin cat to 0
+    allocate(sdlist%NdetSpinCat(sdlist%NspinCat))
+    allocate(sdlist%ShiftSpinCat(sdlist%NspinCat))
+    sdlist%NdetSpinCat(:) = 0
+    sdlist%ShiftSpinCat(:) = 0
+    sdlist%NdetCAS = 0
+
+    !Count the total number of determinans
+    do nexc=0, nmaxexc
+       rexc => get_detact(r,nel,nexc)
+       sdlist%NdetCAS = sdlist%NdetCAS + rexc%NdetCAS
+    enddo
+        
+    !Group all determinants
+    if (sdlist%NdetCAS .ne. 0) then
+       allocate(sdlist%elms(sdlist%NdetCAS))
+       allocate(tmp1(sdlist%NdetCAS))
+       allocate(tmp2(sdlist%NdetCAS))
+       isft = 0
+       do nexc=0, nmaxexc
+          rexc => get_detact(r,nel,nexc)
+          do idetact = 1, rexc%NdetCAS
+             tmp1(isft+idetact) = rexc%elms(idetact)
+          enddo
+          isft = isft + rexc%NdetCAS
+       enddo
+
+       !Sort by spin
+       isft = 0
+       do i = 1,sdlist%NspinCat
+          tmp2(:) = 0
+          nspin = 0
+          spin = sdlist%SpinCat(i)
+          do idetact = 1,sdlist%NdetCAS
+             if (spindiff_detact(tmp1(idetact),nact,sz) .eq. spin) then
+                nspin = nspin+1
+                tmp2(nspin) = tmp1(idetact)
+             endif
+          enddo
+          sdlist%NdetSpinCat(i) = nspin
+          if (nspin .ne. 0) then
+             sdlist%elms(isft+1:isft+nspin) = tmp2(1:nspin)
+          endif
+          sdlist%ShiftSpinCat(i) = isft
+          isft = isft + nspin
+       enddo
+
+       deallocate(tmp1)
+       deallocate(tmp2)
+     else
+       allocate(sdlist%elms(1))
+    endif
+
+    if (debug) then
+       call wrt_spindetact_list(sdlist, f_output, nact)
+       flush(f_output)
+    endif
+       
+  end subroutine spindetact_list_init
+
+
+  !$===================================================================
+  !> @brief Free a spindetact_list
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[in] sdlist spindetact_list to be freed
+  !$==================================================================
+  subroutine spindetact_list_free(sdlist)
+
+    type(spindetact_list), intent(inout) :: sdlist
+
+    integer :: i
+    
+    deallocate(sdlist%SpinCat)
+    deallocate(sdlist%NdetSpinCat)
+    deallocate(sdlist%ShiftSpinCat)
+    deallocate(sdlist%elms)
+    do i = 1, sdlist%nb_rlist
+       call vec_free(sdlist%connect1(i))
+       call vec_free(sdlist%connect2(i))
+    enddo
+    deallocate(sdlist%connect1)
+    deallocate(sdlist%connect2)
+    do i = 1, sdlist%nb_rlist
+       call vec_free(sdlist%connect1orb(i))
+       call vec_free(sdlist%connect2orb(i))
+    enddo
+    deallocate(sdlist%connect1orb)
+    deallocate(sdlist%connect2orb)
+    
+  end subroutine spindetact_list_free
+
+  !$===================================================================
+  !> @brief Printing subroutine for spindetact_list
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[in] d spindetact_list to be printed
+  !> @param[in] iout Logical unit for standard output
+  !> @param[in] nact Number of active orbitals
+  !$==================================================================
+  subroutine wrt_spindetact_list(d, iout, nact)
+
+    implicit none
+    
+    type(spindetact_list), intent(in)   :: d
+    integer,intent(in)                  :: iout, nact
+
+    integer :: i
+    logical :: debug = .true.
+    integer :: nCM1, nCM2
+    integer, pointer :: detCM1(:), detCM2(:)
+
+    write(iout,'(A)') '==='
+    write(iout,'(A,I0,A,I0)') 'Active determinant list R_', &
+         d%nelCAS
+
+    write(iout,'(A,I0,A)') 'Contains ',d%ndetCAS,' determinants'
+    write(iout,*) d%SpinCat
+    write(iout,*) d%NdetSpinCat
+    !do i = 1, d%NdetCAS
+    !   call wrtact(d%elms(i), iout, .false., nact)
+    !enddo
+        
+  end subroutine wrt_spindetact_list
+
+  !$====================================================================
+  !> @brief Compute the connectivity for all R list pairs 
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[inout] rspin List of all spindetact lists
+  !> @param[in] o_info Orbital info
+  !$====================================================================
+  subroutine spindetact_all_connect(rspin, o_info)
+
+    type(o_infotype), intent(in)   :: o_info
+    type(spinrlist), intent(inout) :: rspin
+
+    integer :: i,j, idet
+    type(spindetact_list), pointer :: ri, rj
+
+    do i = 1, rspin%nb_rlist
+       do j = 1, rspin%nb_rlist
+          ri => rspin%l(i)%p
+          rj => rspin%l(j)%p
+          call compute_spinconnectivity(ri, rj, j, o_info)
+       enddo
+    enddo
+    
+  end subroutine spindetact_all_connect
+
+  !$===================================================================
+  !> @brief Compute the connectivity at 1st and second order between
+  !! two lists of active determinants
+  !! Stores the positions of the active determinants detb of dlb which 
+  !! connect with a given determinant deta of dla
+  !! with Ndiff the number of different creation operators in the det
+  !! and deltaNel the difference in number of active electrons,
+  !! connect1 connects determinants where ndiff + deltaNel = 2
+  !! connect2 connects determinants where ndiff + deltaNel = 4
+  !! N.B. use the subroutine CM1() and CM2() to access these matrices
+  !
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[inout] dla first spindetact_list
+  !> @param[inout] dlb second spindetact_list
+  !> @param[in] idlb position of the spindetact_list dlb in the global list
+  !> @param[in] o_info Orbital info
+  !$===================================================================
+  subroutine compute_spinconnectivity(dla, dlb, idlb, o_info)
+
+    implicit none
+
+    type(spindetact_list), intent(inout) :: dla, dlb
+    integer, intent(in)                  :: idlb
+    type(o_infotype), intent(in)         :: o_info
+
+    integer :: ideta, idetb
+    integer :: deltaNel
+    integer(kindact), pointer :: tmp1(:), tmp2(:)
+    integer :: iter1, iter2, ndiff, i, idet
+    integer :: nact, no
+
+    type(connect) :: c
+    
+    nact = o_info%nact
+    no = o_info%nocc + o_info%nligo + o_info%ngel
+
+    !Case ndetCAS = 0 >> dealt with in CM1 and CM2 functions 
+    
+    if (.not.((dla%ndetCAS .eq. 0) .or. (dlb%ndetCAS .eq. 0))) then
+       deltaNel = abs(dla%NelCAS - dlb%NelCAS)
+       if (deltaNel .gt. 2) then
+          !No connectivity matrices are computed
+          call vec_init(dla%connect1(idlb), 0)
+          call vec_init(dla%connect2(idlb), 0)
+          call vec_init(dla%connect1orb(idlb), 0)
+          call vec_init(dla%connect2orb(idlb), 0)
+       else       
+          !Connectivity at 1st and 2nd order are computed
+          !initialise the dla%connect1 and dla%connect2 at the position  
+          !corresponding to dlb
+          !they will contain dla%ndetCAS vectors (i.e. one vector for each
+          !active det in dla) with the list of connecting vector in dlb 
+          call vec_init(dla%connect1(idlb), dla%ndetCAS)
+          call vec_init(dla%connect2(idlb), dla%ndetCAS)
+          call vec_init(dla%connect1orb(idlb), dla%ndetCAS)
+          call vec_init(dla%connect2orb(idlb), dla%ndetCAS)
+
+          allocate(tmp1(dlb%ndetcas))
+          allocate(tmp2(dlb%ndetcas))
+          do ideta = 1, dla%ndetcas
+             tmp1(:) = 0
+             tmp2(:) = 0
+             iter1 = 0
+             iter2 = 0
+             
+             do idetb = 1, dlb%ndetcas
+                ndiff = count_diff(dla%elms(ideta),dlb%elms(idetb), o_info%nact)
+                if ((ndiff + deltaNel) .eq. 2) then
+                   iter1 = iter1 + 1
+                   tmp1(iter1) = idetb
+                else if ((ndiff + deltaNel) .eq. 4) then
+                   iter2 = iter2 + 1
+                   tmp2(iter2) = idetb
+                endif
+             enddo
+             
+             call vec_init(dla%connect1(idlb), ideta, iter1)
+             call vec_init(dla%connect1orb(idlb), ideta, iter1)
+             if (iter1 .ne. 0) then
+                dla%connect1(idlb)%vl(ideta)%p%elms = tmp1(1:iter1)
+                do idet = 1, iter1
+                   idetb = tmp1(idet)              
+                   call fill_connect(dla%connect1orb(idlb)%vl(ideta)%p%elms(idet)%p, &
+                        dla%elms(ideta), dlb%elms(idetb), no, nact)         
+                enddo
+             endif
+             
+             call vec_init(dla%connect2(idlb), ideta, iter2)
+             call vec_init(dla%connect2orb(idlb), ideta, iter2)
+             if (iter2 .ne. 0) then
+                dla%connect2(idlb)%vl(ideta)%p%elms = tmp2(1:iter2)
+                do idet = 1, iter2
+                   idetb = tmp2(idet)              
+                   call fill_connect(dla%connect2orb(idlb)%vl(ideta)%p%elms(idet)%p, &
+                        dla%elms(ideta), dlb%elms(idetb), no, nact)         
+                enddo
+             endif
+
+             
+          enddo
+          deallocate(tmp1)
+          deallocate(tmp2)
+       endif
+    endif
+
+  end subroutine compute_spinconnectivity
+
+
+  !$===================================================================
+  !> @brief Return the Connect1 vector Ri%CM1(idet,Rj)
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[in] ri spindetact_list of the origin detact 
+  !> @param[in] rj spindetact_list of the connecting detacts
+  !> @param[in] idet indx of the origin detact in ri
+  !> @param[in] nact Nb of active orbitals
+  !> @param[out] nCM1 Nb of connecting detact
+  !> @param[out] detCM1 Indices of the connecting detact in rj
+  !$==================================================================
+  subroutine CM1_spindetact_list(ri, rj, idet, nact, nCM1, detCM1, detCM1orb)
+    type(spindetact_list), intent(in) :: ri, rj
+    integer, intent(in)               :: idet
+    integer, intent(in)               :: nact
+    integer, intent(out)              :: nCM1
+    integer, pointer                  :: detCM1(:)
+    type(connectp), pointer, optional :: detCM1orb(:)
+
+    integer :: indx_rj, i, deltaNel
+    logical :: debug = .false.
+    
+    deltaNel = abs(ri%NelCAS - rj%NelCAS)
+    indx_rj = get_Rspinindx(rj%nelCAS)
+    if ((rj%ndetCAS .eq. 0) .or. (deltaNel .gt. 2)) then
+       nCM1 = 0
+    else
+       nCM1 = ri%connect1(indx_rj)%vl(idet)%p%nrow
+    endif
+
+    if (debug) then
+       write(f_output,'(A,I0,A)',advance="no") 'R',ri%nelCAS,'%CM1('
+       call wrtact(ri%elms(idet), f_output, .true., nact)
+       write(f_output,'(A,I0,A)',advance="no") ', R',rj%nelCAS,') '
+       write(f_output,'(A,X,I0,X,A)') 'contains', nCM1, 'active determinants'
+    endif
+       
+    if (nCM1 .ne. 0) then
+       detCM1 => ri%connect1(indx_rj)%vl(idet)%p%elms(:)
+       if (present(detCM1orb)) then
+          detCM1orb => ri%connect1orb(indx_rj)%vl(idet)%p%elms(:)
+       endif
+       if (debug) then
+          do i = 1, nCM1
+             call wrtact(rj%elms(detCM1(i)), f_output, .true., nact)
+             write(f_output,'(4X)',advance="no")  
+          enddo
+          write(f_output,*)
+       endif
+    endif
+
+  end subroutine CM1_spindetact_list
+
+  !$===================================================================
+  !> @brief Return the Connect2 vector Ri%CM2(idet,Rj)
+  !> @author Elisa Rebolini
+  !> @date May 2018
+  !$
+  !> @param[in] ri spindetact_list of the origin detact 
+  !> @param[in] rj spindetact_list of the connecting detacts
+  !> @param[in] idet indx of the origin detact in ri
+  !> @param[in] nact Nb of active orbitals
+  !> @param[out] nCM2 Nb of connecting detact
+  !> @param[out] detCM2 Indices of the connecting detact in rj
+  !$==================================================================
+  subroutine CM2_spindetact_list(ri, rj, idet, nact, nCM2, detCM2, detCM2orb)
+    type(spindetact_list), intent(in) :: ri, rj
+    integer, intent(in)               :: idet
+    integer, intent(in)               :: nact
+    integer, intent(out)              :: nCM2
+    integer, pointer                  :: detCM2(:)
+    type(connectp), pointer, optional :: detCM2orb(:)
+
+    integer :: indx_rj,i, deltaNel
+    logical :: debug = .false.
+    
+    deltaNel = abs(ri%NelCAS - rj%NelCAS)
+
+    indx_rj = get_Rspinindx(rj%nelCAS)
+    if ((rj%ndetCAS .eq. 0) .or. (deltaNel .gt. 2))then
+       nCM2 = 0
+    else
+       nCM2 = ri%connect2(indx_rj)%vl(idet)%p%nrow
+    endif
+       
+    if (nCM2 .ne. 0) then
+       detCM2 => ri%connect2(indx_rj)%vl(idet)%p%elms(:)
+       if (present(detCM2orb)) then
+          detCM2orb => ri%connect2orb(indx_rj)%vl(idet)%p%elms(:)
+       endif
+    endif
+    
+  end subroutine CM2_spindetact_list
+
+  !$====================================================================
+  !> @brief Fill the connect element c for the determinants deta and detb
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] deta Active part 
+  !> @param[in] detb Active part
+  !> @param[inout] 
+  !$====================================================================
+  subroutine fill_connect(c, deta, detb, no, nact)
+
+    integer(kind=kindact), intent(in)  :: deta, detb
+    type(connect), intent(inout)       :: c
+    integer, intent(in)                :: no, nact
+
+    integer, dimension(2)  :: diffi, diffj, spindiffi, spindiffj
+    integer, allocatable  :: andIJ(:), spinandIJ(:)
+    integer               :: sign_act, Ndiffact_I, Ndiffact_J, nandIJ
+    
+    integer(kind=kindact) :: diffalist, diffblist, andablist
+    integer(kind=kd_int)  :: sign_ab
+
+    call sign_diff(deta, detb, diffalist, diffblist, andablist, sign_ab, nact)
+
+    call extract_orbindx_from_detact(diffalist, diffi, spindiffi, no, nact, ndiffact_I)
+    call extract_orbindx_from_detact(diffblist, diffj, spindiffj, no, nact, Ndiffact_J)
+
+    allocate(andIJ(2*nact),spinandIJ(2*nact))
+    call extract_orbindx_from_detact(andablist, andIJ, spinandIJ, no, nact, nandIJ)
+
+    call vec_init(c, nandIJ)
+
+    c%diffi = diffi
+    c%diffj = diffj
+    c%spindiffi = spindiffi
+    c%spindiffj = spindiffj
+    c%andIJ = andIJ(:nandIJ)
+    c%spinandIJ = spinandIJ(:nandIJ)
+    c%nandIJ = nandIJ
+    c%sign_act = sign_ab
+    c%Ndiffact_I = ndiffact_I
+    c%Ndiffact_J = ndiffact_J
+
+    deallocate(andIJ, spinandIJ)
+   
+  end subroutine fill_connect
+
+  subroutine extract_detCMorb_diff(c, diffi, diffj, spindiffi, spindiffj, sign_act, &
+       Ndiffact_I, Ndiffact_J, nandIJ)
+
+    type(connect)         :: c
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer               :: sign_act, Ndiffact_I, Ndiffact_J, nandIJ
+
+    diffi = c%diffi 
+    diffj = c%diffj 
+    spindiffi = c%spindiffi 
+    spindiffj = c%spindiffj 
+    nandIJ = c%nandIJ    
+    sign_act = c%sign_act  
+    Ndiffact_I = c%Ndiffact_I
+    Ndiffact_J = c%Ndiffact_J
+
+  end subroutine extract_detCMorb_diff
+
+  subroutine extract_detCMorb_andIJ(c, diffi, diffj, spindiffi, spindiffj, sign_act, &
+       Ndiffact_I, Ndiffact_J, nandIJ, andIJ, spinandIJ)
+
+    type(connect)         :: c
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer               :: sign_act, Ndiffact_I, Ndiffact_J, nandIJ
+    integer, allocatable  :: andIJ(:), spinandIJ(:)
+
+    diffi = c%diffi 
+    diffj = c%diffj 
+    spindiffi = c%spindiffi 
+    spindiffj = c%spindiffj 
+    andIJ = c%andIJ     
+    spinandIJ = c%spinandIJ 
+    nandIJ = c%nandIJ    
+    sign_act = c%sign_act  
+    Ndiffact_I = c%Ndiffact_I
+    Ndiffact_J = c%Ndiffact_J
+
+  end subroutine extract_detCMorb_andIJ
+
+  subroutine extract_detCMorb_diffgen(c, diffi, diffj, spindiffi, spindiffj, sign_act, &
+       Ndiffact_I, Ndiffact_J)
+
+    type(connect)         :: c
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer               :: sign_act, Ndiffact_I, Ndiffact_J
+
+    diffi = c%diffi 
+    diffj = c%diffj 
+    spindiffi = c%spindiffi 
+    spindiffj = c%spindiffj 
+    sign_act = c%sign_act  
+    Ndiffact_I = c%Ndiffact_I
+    Ndiffact_J = c%Ndiffact_J
+
+  end subroutine extract_detCMorb_diffgen
+
+  subroutine extract_detCMorb_andIJgen(c, diffi, diffj, spindiffi, spindiffj, sign_act, &
+       Ndiffact_I, Ndiffact_J, andIJ, spinandIJ)
+
+    type(connect)         :: c
+    integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+    integer               :: sign_act, Ndiffact_I, Ndiffact_J
+    integer, allocatable  :: andIJ(:), spinandIJ(:)
+
+    diffi = c%diffi 
+    diffj = c%diffj 
+    spindiffi = c%spindiffi 
+    spindiffj = c%spindiffj 
+    andIJ = c%andIJ     
+    spinandIJ = c%spinandIJ 
+    sign_act = c%sign_act  
+    Ndiffact_I = c%Ndiffact_I
+    Ndiffact_J = c%Ndiffact_J
+
+  end subroutine extract_detCMorb_andIJgen
+end module spindetact
diff --git a/src/type_twoint.F90 b/src/type_twoint.F90
new file mode 100644
index 0000000000000000000000000000000000000000..262afaa1410ff2c6511fbfad4faac7c37246fada
--- /dev/null
+++ b/src/type_twoint.F90
@@ -0,0 +1,556 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!$============================================================
+!> @brief Utils for the two-electron integrals
+!$============================================================
+module type_twoint
+
+  use dimensions
+  use files
+
+  implicit none
+
+  !$==========================================================
+  !> @brief Integral kind info for the general H matrix construction
+  !$==========================================================
+  type, public :: intkind_H
+     !> @brief Name of the integral block
+     character(4) :: name
+     !> @brief Logical indicating if a second integral block is needed for
+     !! the exchange interaction
+     logical :: lintx
+     !> @brief Name of the exchange integral block
+     character(4) :: namex
+     !> @brief IJKL function to be used
+     integer :: ijkl_type
+  end type intkind_H
+
+  
+  type, public :: intkind_JK_p
+     type(intkind_JK), pointer :: p
+  end type intkind_JK_p
+
+  !$==========================================================
+  !> @brief Integral kind info for the Hdiag matrix construction
+  !$==========================================================
+  type, public :: intkind_JK
+     !> @brief Label of the JK integral 
+     character(2) :: name
+     !> @brief Number of occupied (if name='oa' then nhole=1) 
+     integer :: nhole
+     !> @brief Number of virtual  (if name='ov' then npart=1) 
+     integer :: npart
+     !> @brief Name of the integral block
+     character(4) :: intname
+     !> @brief Name of the exchange integral block
+     character(4) :: intxname
+     !> @brief Logical indicating if a second integral block is needed for
+     !! the exchange interaction
+     logical :: lintx
+     !> @brief Global sign in front of (J-K)
+     integer :: sign
+     !> @brief Number of determinant blocks to which this int contributes
+     integer :: ndblock
+     !> @brief List of the blocks to which it contributes (integers)
+     integer, pointer :: dnamelist(:)
+     !> @brief List of the blocks to which it contributes (char)
+     !! for subroutine names
+     character(3), pointer :: dnamelistc(:)
+  end type intkind_JK
+
+  
+  !$============================================================
+  !> @brief type for a 2-el integral block 'OOOO', 'AAOO'...
+  !!
+  !! The integrals are stored in a non-redundant way (canonical
+  !! ordering of the indices (ij|kl))
+  !! The position of the integral element in elms for the indices
+  !! i, j, k, l is stored in a 4-dimensional array indx
+  !!
+  !$============================================================
+  type, public :: intblock
+     !> @brief Shift for the i indices
+     integer :: shifti
+     !> @brief Shift for the j indices
+     integer :: shiftj
+     !> @brief Shift for the k indices
+     integer :: shiftk
+     !> @brief Shift for the l indices
+     integer :: shiftl
+     !> @brief Nb of elements along the 1st dim
+     integer :: ni
+     !> @brief Nb of elements along the 2nd dim
+     integer :: nj
+     !> @brief Nb of elements along the 3rd dim
+     integer :: nk
+     !> @brief Nb of elements along the 4th dim
+     integer :: nl
+     !> @brief 4-dimensional array with the position of (ij|kl) in elms 
+     integer, pointer :: indx(:,:,:,:)
+     !> @brief Nb of non-redundant integrals stored in elms
+     integer :: nelms
+     !> @brief Non-redundant two-electron integrals
+     real(kd_dble), pointer :: elms(:)
+  end type intblock
+  
+contains
+
+
+  !$====================================================================
+  !> @brief Fill the list of intkind_JK used for building Hdiag
+  !> @author ER
+  !> @date June 2018
+  !> @param intkindlist List of intkind_JK
+  !> @param nintkind Number of integral kinds
+  !> @param namelist List of the names (labels) of the integral kinds
+  !$====================================================================
+  subroutine intkind_JK_all_init(intkindlist,namelist,nintkind)
+
+    type(intkind_JK_p), pointer :: intkindlist(:)
+    integer, intent(in) :: nintkind
+    character(2), dimension(nintkind) :: namelist
+  
+    character(2) :: name
+    integer :: nhole, npart, sign, ndblock
+    character(4) :: intname, intxname
+    logical :: lintx
+    integer, allocatable :: dnamelist(:)
+    character(3), allocatable :: dnamelistc(:)
+    integer :: i
+    
+    allocate(intkindlist(nintkind))
+    do i = 1, nintkind
+       name = namelist(i)
+       select case (name)
+       case ('aa')
+          nhole = 0
+          npart = 0
+          intname = 'aaaa'
+          intxname = 'aaaa'
+          lintx = .false.
+          sign = 1
+          ndblock = 9
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 00,01,02,11,12,-11,-12,20,-20 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ '000','p01','p02','p11','p12','m11','m12','p20','m20' /)
+       case ('oo')
+          nhole = 2
+          npart = 0
+          intname = 'oooo'
+          intxname = 'oooo'
+          lintx = .false.
+          sign = 1
+          ndblock = 3
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 02,12,20 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ 'p02','p12','p20' /)
+       case ('vv')
+          nhole = 0
+          npart = 2
+          intname = 'vvvv'
+          intxname = 'vvvv'
+          lintx = .false.
+          sign = 1
+          ndblock = 3
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 02,-12,-20 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ 'p02','m12','m20' /)
+       case ('ov')
+          nhole = 1
+          npart = 1
+          intname = 'vvoo'
+          intxname = 'vovo'
+          lintx = .true.
+          sign = -1
+          ndblock = 4
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,12,-12 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ 'p01','p02','p12','m12' /)
+       case ('oa')
+          nhole = 1
+          npart = 0
+          intname = 'aaoo'
+          intxname = 'aoao'
+          lintx = .true.
+          sign = -1
+          ndblock = 6
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,11,12,-12,20 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ 'p01','p02','p11','p12','m12','p20' /)
+       case ('av')
+          nhole = 0
+          npart = 1
+          intname = 'vvaa'
+          intxname = 'vava'
+          lintx = .true.
+          sign = 1
+          ndblock = 6
+          allocate(dnamelist(ndblock))
+          dnamelist(:) = (/ 01,02,12,-11,-12,-20 /)
+          allocate(dnamelistc(ndblock))
+          dnamelistc(:) = (/ 'p01','p02','p12','m11','m12','m20' /)
+       end select
+
+       allocate(intkindlist(i)%p)
+       call intkind_JK_init(intkindlist(i)%p, name, nhole, npart, intname, &
+            intxname, lintx, sign, ndblock, dnamelist, dnamelistc)
+       deallocate(dnamelist)
+       deallocate(dnamelistc)
+    enddo
+  end subroutine intkind_JK_all_init
+
+
+  !$====================================================================
+  !> @brief Fill one intkind_JK used for building Hdiag
+  !> @author ER
+  !> @date June 2018
+  !$====================================================================
+  subroutine intkind_JK_init(intkind, name, nhole, npart, intname, &
+       intxname, lintx, sign, ndblock, dnamelist, dnamelistc)
+
+    type(intkind_JK), intent(inout) :: intkind
+    character(2), intent(in) :: name
+    integer, intent(in) :: nhole, npart, sign, ndblock
+    character(4), intent(in) :: intname, intxname
+    logical, intent(in) :: lintx
+    integer, allocatable, intent(in) :: dnamelist(:)
+    character(3), allocatable :: dnamelistc(:)
+
+    intkind%name = name
+    intkind%nhole = nhole
+    intkind%npart = npart
+    intkind%intname = intname
+    intkind%intxname = intxname
+    intkind%lintx = lintx
+    intkind%sign = sign
+    intkind%ndblock = ndblock
+    nullify(intkind%dnamelist)
+    allocate(intkind%dnamelist(ndblock))
+    intkind%dnamelist(:) = dnamelist(:)
+    nullify(intkind%dnamelistc)
+    allocate(intkind%dnamelistc(ndblock))
+    intkind%dnamelistc(:) = dnamelistc(:)
+        
+  end subroutine intkind_JK_init
+
+  !$====================================================================
+  !> @brief Free one intkind_JK used for building Hdiag
+  !> @author ER
+  !> @date June 2018
+  !$====================================================================
+  subroutine intkind_JK_free(intkind)
+    
+    type(intkind_JK), intent(inout) :: intkind
+    
+    deallocate(intkind%dnamelist)
+    deallocate(intkind%dnamelistc)
+
+  end subroutine intkind_JK_free
+
+  !$====================================================================
+  !> @brief Free all intkind_JK used for building Hdiag
+  !> @author ER
+  !> @date June 2018
+  !$====================================================================
+  subroutine intkind_JK_all_free(intkindlist,nintkind)
+    
+    type(intkind_JK_p), pointer :: intkindlist(:)
+    integer, intent(in) :: nintkind
+
+    integer :: i
+
+    do i =1, nintkind
+       call intkind_JK_free(intkindlist(i)%p)
+       deallocate(intkindlist(i)%p)
+    enddo
+    deallocate(intkindlist)
+    
+  end subroutine intkind_JK_all_free
+  
+  !$====================================================================
+  !> @brief Initialise a type(intblock) object
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[inout] a integral block to be initialised
+  !> @param[in] shifti Shift along the 1st dim
+  !> @param[in] shiftj Shift along the 2nd dim
+  !> @param[in] shiftk Shift along the 3rd dim
+  !> @param[in] shiftl Shift along the 4th dim
+  !> @param[in] ni Nb of elements along the 1st dim
+  !> @param[in] nj Nb of elements along the 2nd dim
+  !> @param[in] nk Nb of elements along the 3rd dim
+  !> @param[in] nl Nb of elements along the 4th dim
+  !> @param[in] nelms Nb of non-redundant integrals
+  !$==================================================================== 
+  subroutine intblock_init(a,shifti,shiftj,shiftk,shiftl,ni,nj,nk,nl,nelms)
+
+    type(intblock) :: a
+    integer :: shifti, shiftj, shiftk, shiftl, ni, nj, nk, nl, nelms
+
+    a%shifti = shifti
+    a%shiftj = shiftj
+    a%shiftk = shiftk
+    a%shiftl = shiftl
+    a%ni = ni
+    a%nj = nj
+    a%nk = nk
+    a%nl = nl
+    a%nelms = nelms
+    nullify(a%indx)
+    allocate(a%indx(shifti+1: shifti+ni, shiftj+1: shiftj+nj, shiftk+1:shiftk+nk, &
+         shiftl+1: shiftl+nl))
+    a%indx(:,:,:,:) = 0
+    nullify(a%elms)
+    allocate(a%elms(nelms))
+    
+  end subroutine intblock_init
+
+  !$====================================================================
+  !> @brief Free a type(intblock) object
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[inout] a integral block to be freed
+  !$==================================================================== 
+  subroutine intblock_free(a)
+
+    type(intblock), intent(inout) :: a
+
+    deallocate(a%indx)
+    deallocate(a%elms)
+
+  end subroutine intblock_free
+
+  !$====================================================================
+  !> @brief Fill a type(intblock) object from file
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[inout] a integral block to be filled
+  !> @param[in] iunit File unit
+  !$==================================================================== 
+  subroutine intblock_fromfile(a,iunit,id_cpu)
+
+    type(intblock), intent(inout)   :: a
+    integer, intent(in)             :: iunit
+    integer, intent(in)             :: id_cpu
+
+    integer :: itmp, i,j,k,l
+    real(kd_dble) :: ijkl
+    character(len=1024) :: filename
+    character(len=1024) :: format_string
+
+    if (id_cpu < 10) then
+       format_string = "(A9,A,I1)"
+    else
+       format_string = "(A9,A,I2)"
+    endif
+    write (filename,format_string) unitname(iunit),".",id_cpu
+#if DVAR_INTEL
+    open(iunit, file=trim(filename), form='unformatted', buffered='yes')
+#else
+    open(iunit, file=trim(filename), form='unformatted')
+#endif
+    !open(iunit, file=unitname(iunit), form='unformatted')
+    do itmp = 1, a%nelms
+       read(iunit) i,j,k,l,ijkl
+       !write(6,*) i,j,k,l,ijkl, itmp
+       a%indx(i,j,k,l) = itmp
+       a%elms(itmp) = ijkl 
+    enddo
+    
+    close(iunit)
+
+  end subroutine intblock_fromfile
+
+  !$====================================================================
+  !> @brief Returns the 2e- integral (m1m2|m3m4)
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[in] a integral block 
+  !> @param[in] m1
+  !> @param[in] m2
+  !> @param[in] m3
+  !> @param[in] m4
+  !$==================================================================== 
+  function ijkl(a,m1,m2,m3,m4)
+    
+    real(kd_dble) ::  ijkl
+    integer, intent(in) :: m1,m2,m3,m4
+    type(intblock), intent(in) :: a
+
+    integer :: n1, n2, n3, n4
+    integer :: ni, nj, nk, nl
+    integer :: indx
+
+    !Get the canonical ordering (ni nj| nk nl) from (m1 m2| m3 m4)
+    !such that n1 >= nj, nk >= nl and ninj >= nknl
+    N1 = M1
+    N2 = M2
+    if (M1.GT.M2) GOTO 511
+    N1 = M2
+    N2 = M1
+511 N3 = M3
+    N4 = M4
+    if (M3.gt.M4) goto 512
+    N3 = M4
+    N4 = M3
+512 NI = N1
+    NJ = N2
+    NK = N3
+    NL = N4
+    if (NI.gt.NK) goto 502
+    if (NI.EQ.NK) goto 514
+    NI = N3
+    NJ = N4
+    NK = N1
+    NL = N2
+    GOTO 502
+514 if (NJ.GT.NL) goto 502
+    NL = N2
+    NJ = N4
+    
+502 indx = a%indx(ni,nj,nk,nl)
+    if (indx .eq. 0) then
+       write(f_debug,*) ni,nj,nk,nl,'Integral not found'
+       write(*,*) ni,nj,nk,nl,'Integral not found'
+       ijkl = 0.d0
+    else
+       ijkl = a%elms(indx)
+    endif
+       
+  end function ijkl
+
+  !$====================================================================
+  !> @brief Returns the 2e- integral (m1m2|m3m4) -- alias for ijkl 
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[in] a integral block 
+  !> @param[in] m1
+  !> @param[in] m2
+  !> @param[in] m3
+  !> @param[in] m4
+  !$==================================================================== 
+  function ijkl2(a,m1,m2,m3,m4)
+    
+    real(kd_dble) ::  ijkl2
+    integer, intent(in) :: m1,m2,m3,m4
+    type(intblock), intent(in) :: a
+
+    ijkl2 = ijkl(a,m1,m2,m3,m4)
+
+  end function ijkl2
+  
+  !$====================================================================
+  !> @brief Returns the 2e- integral (m1m2|m3m4)
+  !! when only m1m2 and m3m4 need to be sorted 
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !$
+  !> @param[in] a integral block 
+  !> @param[in] m1
+  !> @param[in] m2
+  !> @param[in] m3
+  !> @param[in] m4
+  !$==================================================================== 
+  function ijkl1(a,m1,m2,m3,m4)
+    
+    real(kd_dble) ::  ijkl1
+    integer, intent(in) :: m1,m2,m3,m4
+    type(intblock), intent(in) :: a
+
+    integer :: n1, n2, n3, n4
+    integer :: indx
+
+    !Get the canonical ordering (ni nj| nk nl) from (m1 m2| m3 m4)
+    !such that n1 >= nj, nk >= nl 
+    N1 = M1
+    N2 = M2
+    if (M1.GT.M2) GOTO 515
+    N1 = M2
+    N2 = M1
+515 N3 = M3
+    N4 = M4
+    if (M3.gt.M4) goto 516
+    N3 = M4
+    N4 = M3
+    
+516 indx = a%indx(n1,n2,n3,n4)
+    if (indx .eq. 0) then
+       write(f_debug,*) n1,n2,n3,n4,'Integral not found'
+       call SASS_quit('Integral not found',6)
+       ijkl1 = 0.d0
+    else
+       ijkl1 = a%elms(indx)
+    endif
+       
+  end function ijkl1
+
+  !$====================================================================
+  !> @brief Returns the 2e- integral (m1m2|m3m4)
+  !! when the indices should not be sorted
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[in] a integral block 
+  !> @param[in] m1
+  !> @param[in] m2
+  !> @param[in] m3
+  !> @param[in] m4
+  !$==================================================================== 
+  function ijkl0(a,m1,m2,m3,m4)
+    
+    real(kd_dble) ::  ijkl0
+    integer, intent(in) :: m1,m2,m3,m4
+    type(intblock), intent(in) :: a
+
+    integer :: indx
+    
+    indx = a%indx(m1,m2,m3,m4)
+    if (indx .eq. 0) then
+       write(f_debug,*) m1,m2,m3,m4,'Integral not found'
+       ijkl0 = 0.d0
+    else
+       ijkl0 = a%elms(indx)
+    endif
+       
+  end function ijkl0
+
+  
+  
+end module type_twoint
diff --git a/src/typebraket.F90 b/src/typebraket.F90
new file mode 100644
index 0000000000000000000000000000000000000000..7b44e3a537d565b2ae53a872c972c9f7a2b15348
--- /dev/null
+++ b/src/typebraket.F90
@@ -0,0 +1,309 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module typebraket
+
+  use dimensions
+  use info
+  use detact
+
+  implicit none
+
+  type, public :: braket
+
+     integer :: p1, spinp1, sop1
+     integer :: p2, spinp2, sop2
+     integer :: p3, spinp3, sop3
+     integer :: p4, spinp4, sop4
+     integer :: pcase
+     integer :: psign
+     integer :: t1, spint1, sot1
+     integer :: t2, spint2, sot2
+     integer :: t3, spint3, sot3
+     integer :: t4, spint4, sot4
+     integer :: tcase
+     integer :: tsign
+     
+     integer :: spinpI
+     integer :: spinpJ
+     integer :: spinI
+     integer :: spinJ
+     
+     integer :: detshiftI
+     integer :: detshiftJ
+     integer :: idetactI
+     integer :: idetactJ
+     integer :: spinshiftI
+     integer :: spinshiftJ
+     integer :: blockIshift
+     integer :: blockJshift
+     integer :: actcase
+     integer :: spincaseI
+     integer :: spincaseJ
+     integer :: spincasetJ
+
+     integer(kindact) :: detactI, detactJ
+
+     logical :: diagblock
+     logical :: hp_equal
+     logical :: symblock
+
+  end type braket
+
+contains
+
+  subroutine braket_init(a)
+
+    type(braket), intent(out) :: a
+
+    a%p1 = 0
+    a%spinp1 = 0
+    a%p2 = 0
+    a%spinp2 = 0
+    a%p3 = 0
+    a%spinp3 = 0
+    a%p4 = 0
+    a%spinp4 = 0
+    a%sop1 = 0
+    a%sop2 = 0
+    a%sop3 = 0
+    a%sop4 = 0
+
+    a%pcase = 0
+    a%psign = 0
+    
+    a%t1 = 0
+    a%spint1 = 0
+    a%t2 = 0
+    a%spint2 = 0
+    a%t3 = 0
+    a%spint3 = 0
+    a%t4 = 0
+    a%spint4 = 0
+    a%sot1 = 0
+    a%sot2 = 0
+    a%sot3 = 0
+    a%sot4 = 0
+
+    
+    a%tcase = 0
+    a%tsign = 0
+
+    a%spinI = 0
+    a%spinJ = 0
+
+    a%spinpI = 0
+    a%spinpJ = 0
+
+    a%detshiftI = 0
+    a%detshiftJ = 0
+
+    a%blockIshift = 0
+    a%blockJshift = 0
+    
+    a%spinshiftI = 0
+    a%spinshiftJ = 0
+
+    a%idetactI = 0
+    a%idetactJ = 0
+
+    a%actcase = -1
+    a%spincaseI = 0
+    a%spincaseJ = 0
+    a%spincasetJ = 0
+
+    a%diagblock = .false.
+    a%hp_equal = .false.
+    a%symblock = .false.
+    
+  end subroutine braket_init
+
+  subroutine wrt_braket(a, iunit, nact)
+
+    type(braket), intent(in) :: a
+    integer, intent(in)      :: iunit
+    integer, intent(in)      :: nact
+
+    write(iunit,'(X,I4,A,I4,A)', advance='no') &
+         a%blockIshift + a%detshiftI + a%idetactI - a%spinshiftI, ' -- ', &
+         a%blockJshift + a%detshiftJ + a%idetactJ - a%spinshiftJ, ' : '
+         
+    select case (a%actcase)
+    case (0)
+       write(iunit,'(A3,X)', advance='no') 'Id '
+    case (1)
+       write(iunit,'(A3,X)', advance='no') 'CM1'
+    case (2)
+       write(iunit,'(A3,X)', advance='no') 'CM2'
+    end select
+    write(iunit,'(3(X,I3),X,A,3(X,I3),4X)', advance='no') &
+         a%blockIshift, a%detshiftI, a%idetactI - a%spinshiftI, '--', &
+         a%blockJshift, a%detshiftJ, a%idetactJ - a%spinshiftJ
+    if (a%t1 .ne. 0) then
+       write(iunit,'(X,I0)', advance='no') a%t1
+       if (a%spint1 .eq. 1 ) then
+          write(iunit,'(A,X)', advance='no') 'u'
+       else
+          write(iunit,'(A,X)', advance='no') 'd'
+       endif
+       if (a%t2 .ne. 0) then
+          write(iunit,'(I0)', advance='no') a%t2
+          if (a%spint2 .eq. 1 ) then
+             write(iunit,'(A,X)', advance='no') 'u'
+          else
+             write(iunit,'(A,X)', advance='no') 'd'
+          endif
+       endif
+    endif
+    call wrtact(a%detactI, iunit, .true., nact)
+    if (a%p1 .ne. 0) then
+       write(iunit,'(X,I0)', advance='no') a%p1
+       if (a%spinp1 .eq. 1 ) then
+          write(iunit,'(A,X)', advance='no') 'u'
+       else
+          write(iunit,'(A,X)', advance='no') 'd'
+       endif
+       if (a%p2 .ne. 0) then
+          write(iunit,'(I0)', advance='no') a%p2
+          if (a%spinp2 .eq. 1 ) then
+             write(iunit,'(A,X)', advance='no') 'u'
+          else
+             write(iunit,'(A,X)', advance='no') 'd'
+          endif
+       endif
+    endif
+
+    write(iunit,'(A)', advance='no') '--'
+
+    if (a%t3 .ne. 0) then
+       write(iunit,'(X,I0)', advance='no') a%t3
+       if (a%spint3 .eq. 1 ) then
+          write(iunit,'(A,X)', advance='no') 'u'
+       else
+          write(iunit,'(A,X)', advance='no') 'd'
+       endif
+       if (a%t4 .ne. 0) then
+          write(iunit,'(I0)', advance='no') a%t4
+          if (a%spint4 .eq. 1 ) then
+             write(iunit,'(A,X)', advance='no') 'u'
+          else
+             write(iunit,'(A,X)', advance='no') 'd'
+          endif
+       endif
+    endif
+    call wrtact(a%detactJ, iunit, .true., nact)
+    if (a%p3 .ne. 0) then
+       write(iunit,'(X,I0)', advance='no') a%p3
+       if (a%spinp3 .eq. 1 ) then
+          write(iunit,'(A,X)', advance='no') 'u'
+       else
+          write(iunit,'(A,X)', advance='no') 'd'
+       endif
+       if (a%p4 .ne. 0) then
+          write(iunit,'(I0)', advance='no') a%p4
+          if (a%spinp4 .eq. 1 ) then
+             write(iunit,'(A,X)', advance='no') 'u'
+          else
+             write(iunit,'(A,X)', advance='no') 'd'
+          endif
+       endif
+    endif
+    
+    flush(iunit)
+  end subroutine wrt_braket
+
+
+  subroutine fill_Hij_spinorb(a, o_info)
+    
+    type(braket), intent(inout)  :: a
+    type(o_infotype), intent(in) :: o_info
+
+    if (a%t1 .ne. 0) then
+       if (a%spint1 .eq. 1) then
+          a%sot1 = a%t1 - o_info%ngel
+       else
+          a%sot1 = o_info%nocc + o_info%nligo + a%t1 - o_info%ngel
+       endif
+    end if
+
+    if (a%t2 .ne. 0) then
+       if (a%spint2 .eq. 1) then
+          a%sot2 = a%t2 - o_info%ngel
+       else
+          a%sot2 = o_info%nocc + o_info%nligo + a%t2 - o_info%ngel
+       endif
+    endif
+
+    if (a%t3 .ne. 0 ) then
+       if (a%spint3 .eq. 1) then
+          a%sot3 = a%t3 - o_info%ngel
+       else
+          a%sot3 = o_info%nocc + o_info%nligo + a%t3 - o_info%ngel
+       endif
+    endif
+
+    if (a%t4 .ne. 0) then
+       if (a%spint4 .eq. 1) then
+          a%sot4 = a%t4 - o_info%ngel
+       else
+          a%sot4 = o_info%nocc + o_info%nligo + a%t4 - o_info%ngel
+       endif
+    end if
+    
+  end subroutine fill_Hij_spinorb
+  
+
+  function delta(i,j)
+    integer :: i, j, delta
+
+    if (i.eq.j) then
+       delta = 1
+    else
+       delta = 0
+    endif
+  end function delta
+
+  subroutine fill_Hmat(Hmat, Hij, elm)
+    
+    real(kd_dble), dimension(:,:), allocatable :: Hmat
+    type(braket), intent(inout)                :: Hij
+    real(kd_dble)                              :: elm
+    
+    integer :: imat, jmat
+    
+    imat = Hij%blockIshift + Hij%detshiftI &
+         + Hij%idetactI - Hij%spinshiftI
+    jmat = Hij%blockJshift + Hij%detshiftJ &
+         + Hij%idetactJ - Hij%spinshiftJ
+    !write(667,*) 'Fill Hmat, imat=',imat,'jmat=',jmat,'elm =',elm
+    Hmat(imat,jmat) = Hmat(imat,jmat) + elm
+   
+  end subroutine fill_Hmat
+  
+end module typebraket
diff --git a/src/typedet.F90 b/src/typedet.F90
new file mode 100644
index 0000000000000000000000000000000000000000..349faaab24a997fb7b45aae6cf4a1e58f3cf51d6
--- /dev/null
+++ b/src/typedet.F90
@@ -0,0 +1,521 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!----
+
+module typedet
+
+  use dimensions
+
+  interface deter_blocklist_init
+     module procedure deter_dblocklist_init
+  end interface deter_blocklist_init
+
+  interface deter_blocklist_free
+     module procedure deter_dblocklist_free
+  end interface deter_blocklist_free
+  
+  interface get_deter_block_index
+     module procedure get_deter_dblock_index
+  end interface get_deter_block_index
+     
+  interface deter_block_init
+     module procedure deter_dblock_init_empty, deter_dblock_init_full
+  end interface deter_block_init
+
+  interface deter_block_free
+     module procedure deter_dblock_free
+  end interface deter_block_free
+
+  interface fill_deter_block
+     module procedure fill_deter_dblock
+  end interface fill_deter_block
+  
+  !!============================================================ 
+  ! Type determinant
+  !!============================================================  
+  !> @brief type for determinant storage
+  !!
+  !! The active part is stored as two integers (one for the alpha, 
+  !! and one for the beta electrons). The byte string 0001101...
+  !! encoding these integers correspond to the ocuupancy of the
+  !! active orbitals in the determinant
+  !! Each determinant has at max 2 holes and 2 particles in
+  !! (respectively the occupied and virtual spaces), they are thus
+  !! stored as 2 (very short) integers corresponding to the
+  !! orbital number of these holes/particles
+  !!
+  !!============================================================  
+  type :: deter
+     SEQUENCE
+     !> @brief detact active part of the determinant
+     integer (Kind= kindact) :: detact
+     !> @brief dettr  hole part of the determinant
+     integer (Kind= kindTP), dimension(2) :: dettr
+     !> @brief detprt particule part of the determinant
+     integer (Kind= kindTP), dimension(2) :: detprt
+  end type deter
+
+  !!============================================================ 
+  !> @brief type for a D block of determinant
+  !!============================================================ 
+  type deter_dblock
+     !> @brief name block denomination (e.g. for D_0^0 name=00)
+     integer :: name
+     !> @brief string name for code generation
+     character(3) :: namec
+     !> @brief nelCAS Nb of extra electrons in the CAS
+     integer :: nelCAS
+     !> @brief nexcOcc nb of holes in the occupied space
+     integer :: nexcOcc
+     !> @brief nexcVirt Nb of particles in the virtual space
+     integer :: nexcVirt
+     !> @brief nb of determinants
+     integer :: ndet
+     !> @brief Shift in the total list of determinants
+     integer :: shift
+     !> @brief elms Pointer to the deter array
+     type(deter), pointer :: elms(:)
+     
+     !> @brief deltashiftp_array Nb of determinants between p and p+1
+     !! for the different spin cases (UU, UD, DD, U, D etc)
+     integer, pointer :: deltashiftp_array(:)
+     !> @brief shiftp_array Shift for a given p1 (or p2) in the first
+     !! spin category (U or UU)
+     integer, pointer :: shiftp_array(:)
+     !> @brief shiftspinp_array Shift for the beginning of a spin
+     !! case (uu, ud,...)
+     integer, pointer :: shiftspinp_array(:)
+
+     !> @brief deltashiftp_array Nb of determinants between t and t+1
+     !! for the different spin cases (UU, UD, DD, U, D etc)
+     integer, pointer :: deltashifth_array(:)
+     !> @brief shiftp_array Shift for a given t1 (or t2) in the first
+     !! spin category (U or UU)
+     integer, pointer :: shifth_array(:)
+     !> @brief shiftspinh_array Shift for the beginning of a spin
+     !! case (uu, ud,...)
+     integer, pointer :: shiftspinh_array(:)
+  end type deter_dblock
+
+  type deter_dblockp
+     type(deter_dblock), pointer :: p
+  end type deter_dblockp
+
+  type deter_dblocklist
+     type(deter_dblockp), dimension(:), allocatable :: detblock
+     integer :: nblock = 9
+     integer, dimension(9) :: deter_index = (/&
+          00,01,02,11,12,-11,-12,20,-20 /)
+  end type deter_dblocklist
+  
+  
+contains
+  
+  !$==================================================================== 
+  !> @brief Determinant constructor
+  !$==================================================================== 
+  function new_det(hole_1, hole_2, active, virt_1, virt_2)
+    integer, intent(in) :: hole_1, hole_2, virt_1, virt_2
+    integer(kind=kindact) :: active
+    type(deter) :: new_det
+
+    new_det%dettr(1) = hole_1
+    new_det%dettr(2) = hole_2
+    new_det%detact = active
+    new_det%detprt(1) = virt_1
+    new_det%detprt(2) = virt_2
+
+  end function new_det
+  
+  !$==================================================================== 
+  !> @brief Test determinants equality
+  !$==================================================================== 
+  function eq_det(det1,det2)
+    Logical :: eq_det
+    type(deter), intent(in) :: det1,det2
+    Integer :: i
+
+    eq_det = .true.
+    if (det1%detact .ne. det2%detact) then
+       eq_det = .false.
+       return
+    end if
+    do i=1,2
+       if (det1%dettr(i) .ne. det2%dettr(i)) then
+          eq_det = .false.
+          return
+       end if
+    end do
+    do i=1,2
+       if (det1%detprt(i) .ne. det2%detprt(i)) then
+          eq_det = .false.
+          return
+       end if
+    end do
+    
+  end function eq_det
+
+  !$==================================================================== 
+  !> @brief Return index of Dname in d%deter_index
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$==================================================================== 
+  function get_deter_dblock_index(d,name) result(indx)
+
+    implicit none
+    
+    type(deter_dblocklist), intent(in) :: d
+    integer, intent(in) :: name
+
+    integer :: indx
+
+    do indx=1,d%nblock
+       if (d%deter_index(indx) .eq. name) return
+    enddo
+  end function get_deter_dblock_index
+  
+  !$==================================================================== 
+  !> @brief Allocate and initialise a list of nref deter object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$==================================================================== 
+  subroutine deter_init(ref,nref)
+
+    implicit none
+
+    type(deter), dimension(:), allocatable, intent(inout) :: ref
+    integer, intent(in)                                   :: nref
+
+    integer(kd_int) :: i
+
+    if (nref .ne. 0 ) then
+       allocate (ref(nref))
+       do i = 1, nref
+          ref(i)%detact    = 0
+          ref(i)%dettr(:)  = 0
+          ref(i)%detprt(:) = 0
+       end do
+    else
+       write(*,*) 'Warning trying to allocate a det list of size 0'
+    endif
+
+  end subroutine deter_init
+  
+  !$==================================================================== 
+  !> @brief Free a list of deter object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$==================================================================== 
+  subroutine deter_free(ref)
+
+    implicit none
+    
+    type(deter), dimension(:), allocatable, intent(inout) :: ref
+
+    if (allocated(ref)) deallocate(ref)
+
+  end subroutine deter_free
+
+
+  !$==================================================================== 
+  !> @brief Allocate and initialise a list of nblock deter_block object
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine deter_dblocklist_init(d)
+
+    implicit none
+
+    type(deter_dblocklist), intent(inout) :: d
+    
+    integer :: i
+    
+    allocate(d%detblock(d%nblock))
+
+    do i = 1, d%nblock
+       nullify(d%detblock(i)%p)
+       allocate(d%detblock(i)%p)
+       call deter_block_init(d%detblock(i)%p, d%deter_index(i))
+    enddo
+    
+  end subroutine deter_dblocklist_init
+
+  
+  !$==================================================================== 
+  !> @brief Free a list of nblock deter_block object
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine deter_dblocklist_free(d)
+
+    implicit none
+
+    type(deter_dblocklist), intent(inout) :: d
+    
+    integer :: i
+
+    do i = 1, d%nblock
+       if (associated(d%detblock(i)%p)) then
+          call deter_dblock_free(d%detblock(i)%p)
+          deallocate(d%detblock(i)%p)
+       endif
+    enddo
+
+    deallocate(d%detblock)
+  end subroutine deter_dblocklist_free
+
+
+  
+  !$==================================================================== 
+  !> @brief Initialise a deter_block object
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine deter_dblock_init_empty(d,name)
+
+    implicit none
+    
+    type(deter_dblock), intent(out) :: d
+    integer, intent(in) :: name
+
+    d%name = name
+
+    select case (d%name)
+    case (00)
+       d%namec = '000'
+       d%nelCAS = 0
+       d%nexcOcc = 0
+       d%nexcVirt = 0
+    case (01)
+       d%namec = 'p01'
+       d%nelCAS = 0
+       d%nexcOcc = 1
+       d%nexcVirt = 1
+    case (02)
+       d%namec = 'p02'
+       d%nelCAS = 0
+       d%nexcOcc = 2
+       d%nexcVirt = 2
+    case (11)
+       d%namec = 'p11'
+       d%nelCAS = 1
+       d%nexcOcc = 1
+       d%nexcVirt = 0
+    case (12)
+       d%namec = 'p12'
+       d%nelCAS = 1
+       d%nexcOcc = 2
+       d%nexcVirt = 1
+    case (-11)
+       d%namec = 'm11'
+       d%nelCAS = -1
+       d%nexcOcc = 0
+       d%nexcVirt = 1
+    case (-12)
+       d%namec = 'm12'
+       d%nelCAS = -1
+       d%nexcOcc = 1
+       d%nexcVirt = 2
+    case (20)
+       d%namec = 'p20'
+       d%nelCAS = 2
+       d%nexcOcc = 2
+       d%nexcVirt = 0
+    case (-20)
+       d%namec = 'm20'
+       d%nelCAS = -2
+       d%nexcOcc = 0
+       d%nexcVirt = 2
+       
+    case default
+       call SASS_quit('wrong deter dblock type',6)
+    end select
+
+
+    d%ndet = 0
+    
+    nullify(d%deltashiftp_array)
+    nullify(d%shiftp_array)
+    nullify(d%shiftspinp_array)
+    
+    if (d%nexcVirt .gt. 0) then
+       allocate(d%deltashiftp_array(2*d%nexcVirt))
+       d%deltashiftp_array(:) = 0
+       allocate(d%shiftspinp_array(2*d%nexcVirt))
+       d%shiftspinp_array(:) = 0
+    else
+       allocate(d%deltashiftp_array(1))
+       d%deltashiftp_array(:) = 0
+       allocate(d%shiftspinp_array(1))
+       d%shiftspinp_array(:) = 0
+       
+    endif
+
+    nullify(d%shifth_array)
+    nullify(d%deltashifth_array)
+    nullify(d%shiftspinh_array)
+    
+    if (d%nexcOcc .gt. 0) then
+       allocate(d%deltashifth_array(2*d%nexcOcc*max(1,2*d%nexcVirt)))
+       d%deltashifth_array(:) = 0
+       allocate(d%shiftspinh_array(2*d%nexcOcc*max(1,2*d%nexcVirt)))
+       d%shiftspinh_array(:) = 0
+    else
+       allocate(d%deltashifth_array(1))
+       d%deltashifth_array(:) = 0
+       allocate(d%shiftspinh_array(1))
+       d%shiftspinh_array(:) = 0
+    endif
+    
+    nullify(d%elms)
+
+  end subroutine deter_dblock_init_empty
+  
+
+
+  
+  
+  !$==================================================================== 
+  !> @brief Initialise a deter_block object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !$==================================================================== 
+  subroutine deter_dblock_init_full(d,name,elms,ndet)
+
+    implicit none
+
+    type(deter_dblock), intent(out) :: d
+    integer, intent(in) :: name
+    type(deter), dimension(:), allocatable :: elms
+    integer, intent(in) :: ndet
+
+    call deter_block_init(d,name)
+    
+    d%ndet = ndet
+    if (ndet .gt. 0) then
+       allocate(d%elms(d%ndet))
+       d%elms(:) = elms(:)
+    endif
+
+  end subroutine deter_dblock_init_full
+  
+ 
+  !$==================================================================== 
+  !> @brief Free a deter_block object
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine deter_dblock_free(d)
+
+    implicit none
+
+    type(deter_dblock), intent(out) :: d
+
+    if (associated(d%elms)) then
+       deallocate(d%elms)
+    endif
+    if (associated(d%deltashiftp_array)) then
+       deallocate(d%deltashiftp_array)
+    endif
+    if (associated(d%shiftp_array)) then
+       deallocate(d%shiftp_array)
+    endif
+    if (associated(d%shiftspinp_array)) then
+       deallocate(d%shiftspinp_array)
+    endif
+
+    if (associated(d%deltashifth_array)) then
+       deallocate(d%deltashifth_array)
+    endif
+    if (associated(d%shifth_array)) then
+       deallocate(d%shifth_array)
+    endif
+    if (associated(d%shiftspinh_array)) then
+       deallocate(d%shiftspinh_array)
+    endif
+    
+  end subroutine deter_dblock_free
+
+  
+
+  !$==================================================================== 
+  !> @brief Fill a deter_block object of name 'name' with the block
+  !> 'dblock' containing ndet determinants in the deter_block_list
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine fill_deter_dblock(d,name,detblock,ndet)
+
+    implicit none
+    
+    type(deter_dblocklist), intent(inout)   :: d
+    integer, intent(in)                     :: name, ndet
+    type(deter), dimension(:), allocatable  :: detblock
+
+    integer :: indx
+    
+    indx = get_deter_dblock_index(d,name)
+
+    d%detblock(indx)%p%ndet = ndet
+    if (ndet.ne.0) then
+       allocate(d%detblock(indx)%p%elms(ndet))
+       d%detblock(indx)%p%elms(:) = detblock(:)  
+    endif
+    
+  end subroutine fill_deter_dblock
+
+  !$==================================================================== 
+  !> @brief Determines is a matrix block <D_I|H|D_J> is computed directly (.false.)
+  !> or if its symmetric is used (.true.)
+  !> @author Elisa Rebolini
+  !> @date Dec 2020
+  !$==================================================================== 
+  logical function direct_or_sym(DblockI, DblockJ) 
+
+    type(deter_dblock), pointer :: DblockI, DblockJ
+
+    select case (DblockI%nexcVirt)
+    case (2)
+       direct_or_sym = .false.
+    case (1)
+       if (DblockJ%nexcVirt .eq. 2) then
+          direct_or_sym = .true.
+       else
+          direct_or_sym = .false.
+       endif
+    case(0)
+       if (DblockJ%nexcVirt .gt. 0) then
+          direct_or_sym = .true.
+       else
+          direct_or_sym = .false.
+       endif
+    end select
+
+  end function direct_or_sym
+
+end module typedet
diff --git a/src/typetargetvec.F90 b/src/typetargetvec.F90
new file mode 100644
index 0000000000000000000000000000000000000000..aacb6d71a8f76ee7e98f01ca06beb8d9a0d760eb
--- /dev/null
+++ b/src/typetargetvec.F90
@@ -0,0 +1,218 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module typetargetvec
+
+  use info
+  use typedet
+
+  implicit none
+  
+  type :: vecMblock
+     integer :: ndet
+     integer :: nvec
+     real(kd_dble), dimension(:,:), allocatable :: elms
+  end type vecMblock
+
+  type :: vecMblockp
+     type(vecMblock), pointer :: p
+  end type vecMblockp
+  
+  type, public :: vecM
+     integer :: ndblock = 9
+     integer, dimension(9) :: block_index = (/&
+          00,01,02,11,12,-11,-12,20,-20 /)
+     type(vecMblockp), dimension(:), allocatable :: vecblock
+  end type vecM
+
+contains
+
+  !$==================================================================== 
+  !> @brief Allocate and initialise a block of vecM
+  !> @author Elisa Rebolini
+  !> @date June 2018
+  !
+  !> @param v Block of Vm
+  !> @param ndet Nb of determinants in the block (dim2)
+  !> @param nvec Nb of target states (dim1)
+  !$==================================================================== 
+  subroutine vecMblock_init(v,ndet,nvec)
+
+    type(vecMblock), intent(out) :: v
+    integer, intent(in)          :: ndet, nvec
+
+    v%ndet = ndet
+    v%nvec = nvec
+    if (ndet .ne. 0) then
+       allocate(v%elms(nvec,ndet))
+       v%elms(:,:) = 0.d0
+    endif
+    
+  end subroutine vecMblock_init
+
+  !$==================================================================== 
+  !> @brief Free a block of vecM
+  !> @author Elisa Rebolini
+  !> @date June 2018
+  !$====================================================================
+  subroutine vecMblock_free(v)
+
+    type(vecMblock), intent(inout) :: v
+
+    if (v%ndet .ne. 0) then
+       deallocate(v%elms)
+    endif
+       
+  end subroutine vecMblock_free
+
+  !$==================================================================== 
+  !> @brief Write a block of vecM
+  !> @author Elisa Rebolini
+  !> @date March 2020
+  !$====================================================================
+  subroutine wrt_vecMblock(v,iout)
+
+    type(vecMblock), intent(inout) :: v
+    integer, intent(in) :: iout
+
+    integer :: ivec, idet
+
+    do ivec = 1, v%nvec
+       write(iout,'(X,A,I20)', advance = 'no') 'Vec',ivec
+    enddo
+    write(iout, *) ''
+
+    do idet = 1, v%ndet
+       write(iout, *) v%elms(:,idet)
+    enddo
+       
+  end subroutine wrt_vecMblock
+
+  
+  subroutine vecM_init(v,d,nvec)
+
+    type(vecM), intent(out) :: v
+    type(deter_dblocklist), intent(in) :: d
+    integer, intent(in) :: nvec
+
+    integer :: i
+    
+    allocate(v%vecblock(v%ndblock))
+
+    do i = 1, v%ndblock
+       nullify(v%vecblock(i)%p)
+       allocate(v%vecblock(i)%p)
+       call vecMblock_init(v%vecblock(i)%p,d%detblock(i)%p%ndet,nvec)
+    enddo
+    
+  end subroutine vecM_init
+
+
+  subroutine vecM_free(v)
+    type(vecM), intent(inout) :: v
+    
+    integer :: i
+
+    do i = 1, v%ndblock
+       call vecMblock_free(v%vecblock(i)%p)
+       deallocate(v%vecblock(i)%p)
+    enddo
+
+    deallocate(v%vecblock)
+    
+  end subroutine vecM_free
+
+  !$==================================================================== 
+  !> @brief Write a block of vecM
+  !> @author Elisa Rebolini
+  !> @date March 2020
+  !$====================================================================
+  subroutine wrt_vecM(v,iout)
+
+    type(vecM), intent(inout) :: v
+    integer, intent(in) :: iout
+
+    integer :: iblock
+    type(vecMblock), pointer :: vblock
+
+    do iblock = 1, v%ndblock
+       write(iout,'(A,I0,A,I0)') 'Block ', iblock, ' -- ndet = ', v%vecblock(iblock)%p%ndet
+       vblock => v%vecblock(iblock)%p
+       call wrt_vecMblock(vblock,iout)
+    enddo       
+  end subroutine wrt_vecM
+
+  
+  subroutine vecM_from_full(v,v_array,ndet,nvec)
+    Integer, intent(in)             :: ndet,nvec
+    type(vecM)                      :: v
+    real(kd_dble), dimension(ndet,nvec),intent(in)   :: v_array
+    
+    type(vecMblock), pointer :: vblock
+    integer :: i,j,iblock, isft
+
+    isft = 0
+    do iblock = 1, v%ndblock
+       vblock => v%vecblock(iblock)%p
+       if (vblock%ndet .ne. 0) then
+          do i = 1, vblock%nvec
+             do j = 1, vblock%ndet
+                vblock%elms(i,j) = v_array(isft+j,i)
+             enddo
+          enddo
+          isft = isft + vblock%ndet
+       endif
+    enddo
+    
+  end subroutine vecM_from_full
+
+  subroutine vecM_to_full(V,V_array,ndet,nvec)
+    Integer, intent(in)                 :: ndet,nvec
+    type(vecM)                          :: V
+    real(kd_dble), dimension(ndet,nvec) :: V_array
+
+    type(vecMblock), pointer :: vblock
+    integer :: i,j,iblock, isft
+
+    isft = 0
+    do iblock = 1, v%ndblock
+       vblock => v%vecblock(iblock)%p
+       if (vblock%ndet .ne. 0) then
+          do i = 1, vblock%nvec
+             do j = 1, vblock%ndet
+                v_array(isft+j,i) = vblock%elms(i,j) 
+             enddo
+          enddo
+          isft = isft + vblock%ndet
+       endif
+    enddo
+
+  end subroutine vecM_to_full
+  
+end module typetargetvec
diff --git a/src/utils.F90 b/src/utils.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ec1e8666544f4f7102e196a75eaa867b7e2303f4
--- /dev/null
+++ b/src/utils.F90
@@ -0,0 +1,504 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+
+Module utils
+  implicit none
+  public 
+
+contains 
+!!$============================================================
+  function comb(n,p)
+    Integer :: comb
+    Integer, intent(in) :: n,p
+
+    Integer :: i
+    Integer*8 :: f
+
+    if (p.gt.n) then 
+       write(6,*) n,p
+       flush(6)
+       Stop " ***** Erreur Cnp *****"
+    end if
+    f = 1
+    do i = p+1, n
+       f = f * i 
+    end do
+    do i = 1,n-p
+       f = f / i
+    end do
+    comb = int(f)
+    
+    return
+  end function comb
+        
+!!$============================================================
+  subroutine smoins(dact,isz,ns,dim,nv,nact)
+    ! dact : partie active de spin max sur laquelle faire S-, que des alpha
+    ! isz  : nombre de couches ouvertes = nbre de bits non nuls de dact 
+    ! ns   : nombre de spins à retourner = nombre de fois où on fait agir S-
+    ! dim  : nombre de det à engendrer au final 
+    ! nv   : det engendrés par action de S-
+    use info
+
+    Integer (Kind= kindact), intent(in) :: dact ! conf de spin max
+    ! spin de départ, nbre de spin a retourne et nbre de det à engendrer
+    Integer, intent(in) :: isz, ns, dim, nact 
+    Integer (Kind= kindact), dimension(dim) :: Nv ! nouveaux det
+    Integer, dimension(0:ns) :: n
+    Integer (Kind= kindact), dimension(:), allocatable :: nv1, nv2
+    Integer (Kind= kindact) :: dacttmp
+    Integer :: cnt, i,j,k, ibit, ntmp
+    
+    n(0) = 1
+    do i = 1,ns
+       n(i) = comb(isz,i)
+    end do
+    
+    allocate(nv1(1))
+    nv1(1) = dact
+      
+    do i = 1,ns
+       ntmp = n(i)
+       allocate(nv2(ntmp))
+       nv2(:) = 0
+       cnt = 0
+       do j = 1, n(i-1)
+          do ibit = 0, nact-1
+             if (btest(nv1(j),ibit)) then 
+                ! verification que l'on n'a pas deja ce det
+                dacttmp = ibclr(nv1(j), ibit) 
+                dacttmp = ibset(dacttmp, ibit+nact) 
+                do k=1,cnt
+                   if (dacttmp.eq.nv2(k)) goto 1
+                end do
+                ! si non on le cree
+                cnt = cnt + 1
+                nv2(cnt) = dacttmp
+             end if
+1         end do
+       end do
+       deallocate(nv1)
+       allocate(nv1(n(i)))
+       nv1(:) = nv2(:)
+       deallocate(nv2)
+    end do
+    
+    if (cnt.ne.dim) stop ">>> Erreur S- <<<"
+    nv(1:dim) = nv1(1:dim)
+    deallocate(nv1)
+  end subroutine smoins
+
+!$====================================================================
+!> @brief <det|Sz|det>
+!> @author MBL
+!> @date Mai 2020
+!
+!> @param[in] det = determinant 
+!> @param[in] ndet = number of determinants
+!> @param[out] Sz =  <det|Sz|det>
+!$====================================================================
+  subroutine sz_det(det,sz,o_info,shtrous, shpart)
+    use info
+    use typedet
+    type(deter),          intent(in)  :: det
+    type(o_infotype),     intent(in)  :: o_info
+    Integer(KIND=kd_int), intent(out) :: Sz
+    Integer,              intent(in)  :: shtrous, shpart
+    
+    Integer(KIND=kd_int) :: nact
+    Integer(kindact) :: tmpact
+    integer (Kind= kindTP), dimension(2) :: trous, part
+    Integer :: iact, itmp, i, j,  idet
+
+    nact = o_info%nact
+    
+    do iact =1,nact
+       tmpact =  det%detact
+       itmp = 0
+       do j = 1,nact ! boucle sur les orb alpha
+          if (btest(tmpact,j-1)) itmp = itmp +1
+       end do
+       do j = 1+nact,2*nact ! boucle sur les orb beta 
+          if (btest(tmpact,j-1)) itmp = itmp -1
+       end do
+    end do
+    
+    ! calcul de Sz sur trous -> itmp
+    trous = det%dettr
+    do i=1,2
+       if (trous(i).eq.0) goto 1001
+       if (trous(i).le.shtrous) then
+          itmp = itmp - 1
+       else
+          itmp = itmp + 1 
+       end if
+    end do
+    
+    ! calcul de Sz sur particules  -> itmp
+1001 continue
+    part = det%detprt
+    do i=1,2
+       if (part(i).eq.0) goto 1002
+       if (part(i).le.shpart) then
+          itmp = itmp + 1
+       else
+          itmp = itmp - 1 
+       end if
+    end do
+    
+1002 continue
+    Sz=itmp 
+    
+  end subroutine sz_det
+!$====================================================================
+!> @brief S-|det>
+!> @author MBL
+!> @date Mai 2020
+!
+!> @param[in] det = determinant 
+!> @param[in] ndet = number of determinants
+!> @param[out] Smdet =  S-|det>
+!$====================================================================
+  subroutine smoins_det(det,Smdet,signdet,nco,o_info,shtrous, shpart)
+    use info
+    use typedet
+    use utils_bits
+    use utils_wrt
+    type(deter),          intent(in)  :: det
+    type(o_infotype),     intent(in)  :: o_info
+    Integer,              intent(in)  :: shtrous, shpart
+    Integer,              intent(out) :: nco
+    type(deter), dimension(:), allocatable, intent(out) :: Smdet
+    Integer,     dimension(:), allocatable, intent(out) :: signdet
+
+
+    Integer(KIND=kd_int)  :: nact
+    Integer(kindact) :: tmpact
+    integer (Kind= kindTP), dimension(2) :: trous, part
+    Integer :: iact, ico, i, itmp
+
+    nact = o_info%nact
+
+    ! nbre de couches ouvertes
+    nco = 0
+    do iact =1,nact
+       if (btest(det%detact,iact-1) .NEQV. btest(det%detact,iact-1+nact)) nco = nco + 1
+    end do
+    do i=1,2
+       if (det%dettr(i).eq.0) exit
+       nco = nco + 1
+    end do
+    do i=1,2
+       if (det%detprt(i).eq.0) exit
+       nco = nco + 1
+    end do
+
+    allocate(Smdet(nco),signdet(nco))
+    do i=1,nco
+       Smdet(i)%detact    = 0
+       Smdet(i)%dettr(:)  = 0
+       Smdet(i)%detprt(:) = 0
+       signdet(:)         = 0
+    end do
+    
+    ! S- sur actives
+    ico=0
+    do iact =1,nact
+       if (btest(det%detact,iact-1)) then 
+          if (btest(det%detact,iact-1+nact)) cycle
+          ico = ico + 1
+          Smdet(ico)%detact = det%detact
+          Smdet(ico)%detact = ibclr(Smdet(ico)%detact, iact-1)
+          Smdet(ico)%detact = ibset(Smdet(ico)%detact, iact-1+nact)
+          signdet(ico) = sumbits_new(det%detact,iact,iact-2+nact)
+          signdet(ico) = 1-2*mod(signdet(ico),2)
+          Smdet(ico)%dettr  = det%dettr
+          Smdet(ico)%detprt = det%detprt
+          ! write(f_output,'("act:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+       end if
+    end do
+    
+    ! S- sur trous
+    if (det%dettr(1).eq.0) goto 1001
+    if (det%dettr(2).gt.shtrous) then  ! t2d < t1d
+       ico = ico+1
+       Smdet(ico)%detact    = det%detact
+       Smdet(ico)%dettr(1)  = det%dettr(2)
+       Smdet(ico)%dettr(2)  = det%dettr(1) - (o_info%nocc + o_info%nligo)
+       Smdet(ico)%detprt = det%detprt
+       signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo, 2)
+       ! write(f_output,'("tr :",I3,":",3x)',advance="no") ico
+       ! call wrtdet(Smdet(ico), f_output, o_info)
+       ico = ico+1
+       Smdet(ico)%detact    = det%detact
+       Smdet(ico)%dettr(1)  = det%dettr(1)
+       Smdet(ico)%dettr(2)  = det%dettr(2) - (o_info%nocc + o_info%nligo)
+       Smdet(ico)%detprt = det%detprt
+       signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo+1, 2)
+       ! write(f_output,'("tr :",I3,":",3x)',advance="no") ico
+       ! call wrtdet(Smdet(ico), f_output, o_info)
+    else if (det%dettr(1).gt.shtrous .and. &       ! t2u < t1d
+         det%dettr(2).ne. (det%dettr(1)- (o_info%nocc + o_info%nligo)) ) then
+       ico = ico+1
+       Smdet(ico)%detact    = det%detact
+       itmp = det%dettr(1)- (o_info%nocc + o_info%nligo)
+       if (itmp.gt.det%dettr(2)) then
+          Smdet(ico)%dettr(1)  = itmp
+          Smdet(ico)%dettr(2)  = det%dettr(2)
+          signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo+1, 2)
+       else
+          Smdet(ico)%dettr(1)  = det%dettr(2)
+          Smdet(ico)%dettr(2)  = itmp
+          signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo, 2)
+       end if
+       Smdet(ico)%detprt = det%detprt
+       ! write(f_output,'("tr :",I3,":",3x)',advance="no") ico
+       ! call wrtdet(Smdet(ico), f_output, o_info)
+    end if
+
+    ! S- sur particules
+1001 if (det%detprt(1).eq.0 .or. det%detprt(1).gt.shpart) goto 1010 
+    if (det%detprt(2).le.shpart) then
+       if (det%detprt(2).ne.0) then      
+          ico = ico+1
+          Smdet(ico)%detact    = det%detact
+          Smdet(ico)%dettr     = det%dettr
+          Smdet(ico)%detprt(1) = det%detprt(2)
+          Smdet(ico)%detprt(2) = det%detprt(1) + (o_info%nligv +  o_info%nvirt)
+          signdet(ico) = -1
+          ! write(f_output,'("prt:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+          ico = ico+1
+          Smdet(ico)%detact    = det%detact
+          Smdet(ico)%dettr     = det%dettr
+          Smdet(ico)%detprt(1) = det%detprt(1) 
+          Smdet(ico)%detprt(2) = det%detprt(2) + (o_info%nligv +  o_info%nvirt)
+          signdet(ico) = 1
+          ! write(f_output,'("prt:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+       else
+          ico = ico+1
+          Smdet(ico)%detact    = det%detact
+          Smdet(ico)%dettr     = det%dettr
+          Smdet(ico)%detprt(1) = det%detprt(1) + (o_info%nligv +  o_info%nvirt)
+          Smdet(ico)%detprt(2) = det%detprt(2)
+          signdet(ico) = 1
+          ! write(f_output,'("prt:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+       end if
+    else
+       if (  det%detprt(2).gt. (det%detprt(1)+ (o_info%nligv +  o_info%nvirt)) ) then
+          ico = ico+1
+          Smdet(ico)%detact    = det%detact
+          Smdet(ico)%dettr     = det%dettr
+          Smdet(ico)%detprt(1) = det%detprt(1) + (o_info%nligv +  o_info%nvirt)
+          Smdet(ico)%detprt(2) = det%detprt(2)
+          signdet(ico) = 1
+          ! write(f_output,'("prt:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+       else if (  det%detprt(2).lt. (det%detprt(1)+ (o_info%nligv +  o_info%nvirt)) ) then
+          ico = ico+1
+          Smdet(ico)%detact    = det%detact
+          Smdet(ico)%dettr     = det%dettr
+          Smdet(ico)%detprt(1) = det%detprt(2)
+          Smdet(ico)%detprt(2) = det%detprt(1) + (o_info%nligv +  o_info%nvirt)
+          signdet(ico) = -1
+          ! write(f_output,'("prt:",I3,":",3x)',advance="no") ico
+          ! call wrtdet(Smdet(ico), f_output, o_info)
+       end if
+    end if
+
+1010 continue 
+    nco = ico
+  end subroutine smoins_det
+!$====================================================================
+!> @brief S+|det>
+!> @author MBL
+!> @date Mai 2020
+!
+!> @param[in] det = determinant 
+!> @param[in] ndet = number of determinants
+!> @param[out] Spdet =  S+|det>
+!$====================================================================
+  subroutine splus_det(det,Spdet,signdet,nco,o_info,shtrous, shpart)
+    use info
+    use typedet
+    use utils_bits
+    use utils_wrt
+    type(deter),          intent(in)  :: det
+    type(o_infotype),     intent(in)  :: o_info
+    Integer,              intent(in)  :: shtrous, shpart
+    Integer,              intent(out) :: nco
+    type(deter), dimension(:), allocatable, intent(out) :: Spdet
+    Integer,     dimension(:), allocatable, intent(out) :: signdet
+
+    Integer(KIND=kd_int)  :: nact
+    Integer(kindact) :: tmpact
+    integer (Kind= kindTP), dimension(2) :: trous, part
+    Integer :: iact, ico, i, itmp
+
+    nact = o_info%nact
+    ! call wrtdet(det, f_output, o_info)
+    
+    ! nbre de couches ouvertes
+    nco = 0
+    ico = 0
+    do iact =1,nact
+       if (btest(det%detact,iact-1) .NEQV. btest(det%detact,iact-1+nact)) nco = nco + 1
+    end do
+    
+    do i=1,2
+       if (det%dettr(i).eq.0) exit
+       nco = nco + 1
+    end do
+    do i=1,2
+       if (det%detprt(i).eq.0) exit
+       nco = nco + 1
+    end do
+    
+    allocate(Spdet(nco),signdet(nco))
+    do i=1,nco
+       Spdet(i)%detact    = 0
+       Spdet(i)%dettr(:)  = 0
+       Spdet(i)%detprt(:) = 0
+       signdet(:)         = 0
+    end do
+
+    ! write(f_output,*) "nco=",nco
+    if (nco.eq.0) goto 1010 ! return
+
+
+    ! S+ sur actives
+    do iact = 1+nact, 2*nact
+       if (btest(det%detact,iact-1)) then 
+          if (btest(det%detact,iact-1-nact)) cycle
+          ico = ico + 1
+          Spdet(ico)%detact = det%detact
+          Spdet(ico)%detact = ibclr(Spdet(ico)%detact, iact-1)
+          Spdet(ico)%detact = ibset(Spdet(ico)%detact, iact-1-nact)
+          signdet(ico) = sumbits_new(det%detact,iact-nact,iact-2)
+          signdet(ico) = 1-2*mod(signdet(ico),2)
+          Spdet(ico)%dettr  = det%dettr
+          Spdet(ico)%detprt = det%detprt
+          ! write(f_output,'("act:",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+          ! call wrtdet(Spdet(ico), f_output, o_info)
+       end if
+    end do
+    flush(f_output)
+    
+    ! S+ sur trous
+    if (det%dettr(1).eq.0) goto 1001
+    if (det%dettr(2).gt.shtrous) goto 1001 ! t2_d < t1_d 
+    if (det%dettr(1).le.shtrous) then ! t2_u < t1_u ou  t1_u 
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       Spdet(ico)%dettr(1)  = det%dettr(1) + (o_info%nocc + o_info%nligo)
+       Spdet(ico)%dettr(2)  = det%dettr(2)
+       Spdet(ico)%detprt = det%detprt
+       signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo+1, 2)
+       ! write(f_output,'("tr :",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+       if (det%dettr(2).eq.0) goto 1001
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       Spdet(ico)%dettr(1)  = det%dettr(2) + (o_info%nocc + o_info%nligo)
+       Spdet(ico)%dettr(2)  = det%dettr(1)
+       Spdet(ico)%detprt = det%detprt
+       signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo, 2)
+       ! write(f_output,'("tr :",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+    else if (det%dettr(2).ne.0 .and. &     ! t2_u & t1_d
+         det%dettr(2).ne. (det%dettr(1)- (o_info%nocc + o_info%nligo)) ) then
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       itmp = det%dettr(2) + (o_info%nocc + o_info%nligo)
+       if (itmp.lt.det%dettr(1)) then
+          Spdet(ico)%dettr(1)  = det%dettr(1)
+          Spdet(ico)%dettr(2)  = itmp
+          signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo+1, 2)
+       else
+          Spdet(ico)%dettr(1)  = itmp
+          Spdet(ico)%dettr(2)  = det%dettr(1)
+          signdet(ico) = 1 - 2*mod(o_info%nocc+o_info%nligo, 2)
+       end if
+       Spdet(ico)%detprt = det%detprt
+       ! write(f_output,'("tr :",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+    end if
+
+    ! S+ sur particules
+1001 if (det%detprt(1).eq.0) goto 1010 
+    if (det%detprt(2).ne.0 .and. det%detprt(2).le.shpart) goto 1010
+    if (det%detprt(2).eq.0 .and. det%detprt(1).le.shpart) goto 1010 
+    if (det%detprt(1).gt.shpart) then ! p1d < p2d ou p1d
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       Spdet(ico)%dettr     = det%dettr
+       Spdet(ico)%detprt(1) = det%detprt(1) - (o_info%nligv +  o_info%nvirt)
+       Spdet(ico)%detprt(2) = det%detprt(2)
+       signdet(ico) = 1
+       ! write(f_output,'("prt1:",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+       if (det%detprt(2).eq.0) goto 1010  ! p1d < p2d
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       Spdet(ico)%dettr     = det%dettr
+       Spdet(ico)%detprt(1) = det%detprt(2) - (o_info%nligv +  o_info%nvirt) 
+       Spdet(ico)%detprt(2) = det%detprt(1)
+       signdet(ico) = -1
+       ! write(f_output,'("prt2:",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+    else if (det%detprt(1) .ne. det%detprt(2)-(o_info%nligv +  o_info%nvirt)) then ! p1u & p2d 
+       ico = ico+1
+       Spdet(ico)%detact    = det%detact
+       Spdet(ico)%dettr     = det%dettr
+       
+       itmp = det%detprt(2) - (o_info%nligv +  o_info%nvirt)
+       if (itmp.gt. det%detprt(1)) then  ! p1 < p2
+          Spdet(ico)%detprt(1) = det%detprt(1) 
+          Spdet(ico)%detprt(2) = itmp
+          signdet(ico) = 1 
+       else  ! p2 < p1
+          Spdet(ico)%detprt(1) = itmp
+          Spdet(ico)%detprt(2) = det%detprt(1)
+          signdet(ico) = -1 
+       end if
+       ! write(f_output,'("prt3:",I3,":"," signe=",i3,3x)',advance="no") ico, signdet(ico) 
+       ! call wrtdet(Spdet(ico), f_output, o_info)
+    end if
+
+1010 continue
+    ! write(f_output,*) "ico=",ico
+    ! write(f_output,*) "---------------------------------------------"
+    nco = ico
+  end subroutine splus_det
+!!$============================================================
+End Module utils
diff --git a/src/utils_batch.F90 b/src/utils_batch.F90
new file mode 100644
index 0000000000000000000000000000000000000000..8c31d8e361343cae40da9b733e81c94567793b59
--- /dev/null
+++ b/src/utils_batch.F90
@@ -0,0 +1,239 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module utils_batch
+
+  use info
+  use files
+  
+  implicit none
+
+
+  !!=====================================================================
+  !> @brief type for the MPI blocks used in the calcualtion of HV
+  !!=====================================================================
+  type, public :: int_blockpair
+     !> @brief index of the determinant block I
+     !! 1 to 9 corresponding to the blocks 00,01,02,11,12,-11,-12,20,-20 
+     integer :: indxI
+     !> @brief index of the determinant block J
+     integer :: indxJ
+     !> @brief index of the spin case when the outer loop is divided in several spin blocks (U, D, UU...)
+     integer :: spincase
+     !> @brief index for the integral which contribution is added 
+     integer                       :: indxIntkind
+     !> @brief name of the integral whixh contribution is added
+     character(4)                  :: intkind
+     !> @brief .true. if batching on the particle loop
+     logical                       :: batch
+     !> @brief min and max value of the particle loop 
+     integer                       :: pmin, pmax
+  end type int_blockpair
+
+  !!=====================================================================
+  !> @brief type for the list of  MPI blocks used in the calcualtion of HV
+  !!=====================================================================
+  type, public :: int_blockpair_list
+     !> @brief number of blocks
+     integer :: nint_blockpair
+     !> @brief CPU and wall timings of the blocks
+     real(kd_dble), dimension(:), allocatable :: cputime, wtime
+     !> @brief list of all MPI blocks (fixed order)
+     type(int_blockpair), dimension(:), allocatable :: l
+     !> @brief ordering of the integral blocks to be used in order to balnce the MPI load
+     integer, dimension(:), allocatable :: indx
+  end type int_blockpair_list
+
+
+contains
+
+  !$========================================================================
+  !> @brief Initialise a list of nblock int_blockpairs
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine int_blockpair_list_init(list, nblock)
+
+    type(int_blockpair_list) :: list
+    integer, intent(in)      :: nblock
+
+    integer :: i
+
+    list%nint_blockpair = nblock
+    allocate(list%l(list%nint_blockpair))
+    allocate(list%indx(list%nint_blockpair))
+    allocate(list%cputime(list%nint_blockpair))
+    allocate(list%wtime(list%nint_blockpair))
+
+    do i=1, list%nint_blockpair
+       call int_blockpair_init(list%l(i))
+       list%indx(i) = i
+       list%cputime(i) = 0d0
+       list%wtime(i) = 0d0
+    enddo
+    
+  end subroutine int_blockpair_list_init
+
+  !$========================================================================
+  !> @brief Free a list of int_blockpairs
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine int_blockpair_list_free(list)
+
+    type(int_blockpair_list) :: list
+
+    deallocate(list%l)
+    deallocate(list%indx)
+    deallocate(list%cputime)
+    deallocate(list%wtime)
+    
+  end subroutine int_blockpair_list_free
+
+  !$========================================================================
+  !> @brief Initialise an int_blockpair
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine int_blockpair_init(mpi_case)
+
+    type(int_blockpair) :: mpi_case
+
+    mpi_case%indxI = 0
+    mpi_case%indxJ = 0
+    mpi_case%indxIntkind = 0
+    mpi_case%spincase = 0
+    mpi_case%intkind = '    '
+    mpi_case%batch = .false.
+    mpi_case%pmin = 0
+    mpi_case%pmax = 0
+
+  end subroutine int_blockpair_init
+
+  !$========================================================================
+  !> @brief Write an int_blockpair
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine wrt_int_blockpair(mpiitem, iunit)
+
+    type(int_blockpair) :: mpiitem
+    integer :: iunit
+
+    write(iunit, '(2A,I3,A,I3,A,I3,A,I3,A,I3)') & 
+         mpiitem%intkind, ' : D',mpiitem%indxI, &
+         ' : D',mpiitem%indxJ,' : spin ',&
+         mpiitem%spincase, ' pmin ',mpiitem%pmin,' pmax ',mpiitem%pmax
+
+  end subroutine wrt_int_blockpair
+
+
+  !$========================================================================
+  !> @brief Write an int_blockpair list
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine wrt_int_blockpair_list(mpilist, iunit)
+
+    type(int_blockpair_list), intent(in)  :: mpilist
+    integer, intent(in)                   :: iunit
+
+    integer :: i
+
+    do i = 1, mpilist%nint_blockpair
+       write(iunit,'(I4,A,I4,A)', advance='no') i, ' : ', mpilist%indx(i), ' : '
+       call wrt_int_blockpair(mpilist%l(i), iunit)
+    enddo
+    flush(iunit)
+    
+  end subroutine wrt_int_blockpair_list
+    
+
+  !$========================================================================
+  !> @brief Create the full list with batching of the concerned blocks
+  !> @author ER
+  !> @date Nov 2020
+  !$========================================================================
+  subroutine get_mpiblockpair_list(mpilist, sizebatch, nvirtual)
+
+    type(int_blockpair_list), intent(out) :: mpilist
+    integer, intent(in)                   :: sizebatch, nvirtual
+    
+    integer :: nblockbatch, nblockunbatch, nblock_mpi, nbatch
+    type(int_blockpair_list) :: batchlist, unbatchlist
+
+    integer :: iblock, ibatch, shift, pmin, pmax
+
+    call int_blockpair_list_batch(batchlist)
+    call int_blockpair_list_unbatch(unbatchlist)
+
+    nblockbatch = batchlist%nint_blockpair
+    nblockunbatch = unbatchlist%nint_blockpair
+
+    if (modulo(nvirtual, sizebatch) .eq. 0) then
+       nbatch = nvirtual / sizebatch
+    else
+       nbatch = nvirtual / sizebatch + 1
+    endif
+
+    nblock_mpi = nblockunbatch + nblockbatch * nbatch
+    
+    
+    call int_blockpair_list_init(mpilist, nblock_mpi)
+
+    shift = 0
+    do ibatch = 1, nbatch
+       pmin = (ibatch-1)*sizebatch
+       pmax = min(pmin + sizebatch, nvirtual)
+
+       do iblock = 1, nblockbatch
+          mpilist%l(shift+iblock) = batchlist%l(iblock)
+          mpilist%l(shift+iblock)%pmin = pmin
+          mpilist%l(shift+iblock)%pmax = pmax
+       enddo
+       shift = shift + nblockbatch
+    enddo
+
+    do iblock = 1, nblockunbatch
+       mpilist%l(shift+iblock) = unbatchlist%l(iblock)
+       mpilist%l(shift+iblock)%pmin = 0
+       mpilist%l(shift+iblock)%pmax = nvirtual
+    enddo
+    
+    call int_blockpair_list_free(batchlist)
+    call int_blockpair_list_free(unbatchlist)
+
+    !do iblock = 1, nblock_mpi
+    !   write(*,'(X,I4,X)', advance="no") iblock
+    !   call wrt_int_blockpair(mpilist%l(iblock),6)
+    !enddo
+    
+  end subroutine get_mpiblockpair_list
+
+end module utils_batch
diff --git a/src/utils_bits.F90 b/src/utils_bits.F90
new file mode 100644
index 0000000000000000000000000000000000000000..1f61d9e6668fe31d870a8655faabf07134bf3aee
--- /dev/null
+++ b/src/utils_bits.F90
@@ -0,0 +1,94 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+Module utils_bits
+
+  use dimensions
+
+  implicit none
+
+  public :: sumbits, sumbits_new, trouvbits
+  
+contains 
+!!$============================================================
+  Function sumbits(Idet,i1,i2) result(ss)
+    ! Nbre de bits = 1 entre les bits i1 et i2 compris de Idet
+    Integer (KIND=kindact), intent(in) :: Idet
+    Integer, intent(in) :: i1,i2 
+    Integer :: ss
+    Integer :: ibit, itmp, iorb
+    
+    ss    = 0
+    do ibit = i1,  i2
+       itmp = int(ibits(Idet, ibit, 1))
+       ss   = ss + itmp
+    end do
+    
+  End Function sumbits
+!!$============================================================
+  Function sumbits_new(Idet,i1,i2) result(ss)
+    ! Nbre de bits = 1 entre les bits i1 et i2 compris de Idet
+    Integer (KIND=kindact), intent(in) :: Idet
+    Integer, intent(in) :: i1,i2
+    Integer :: ss, Jdet 
+    Integer :: ibit, itmp
+    
+    Jdet = int(Idet)
+    ss    = 0
+    do ibit = i1,  i2
+       itmp = ibits(Jdet, ibit, 1)
+       ss   = ss + itmp
+    end do
+  
+  End Function sumbits_new
+!!$============================================================
+  Function trouvbits(Idet,i1,i2) result(ss)
+    ! Trouve les bits = 1 entre les bits i1 et i2 compris de Idet
+    Integer (KIND=kindact), intent(in) :: Idet
+    Integer, intent(in) :: i1,i2
+    Integer, dimension(0:i2-i1+1) :: ss
+    Integer :: Jdet, ibit, itmp, iorb, n
+    
+    Jdet    = int(Idet)
+    ss(:)   = 0
+    n       = 1
+    do ibit = i1,  i2
+       itmp = ibits(Jdet, ibit, 1)
+       ss(n) = ibit
+       n   = n + itmp
+    end do
+    ss(0) = n-1
+    
+  End Function trouvbits
+!!$============================================================
+End Module utils_bits
+
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/utils_char.F90 b/src/utils_char.F90
new file mode 100644
index 0000000000000000000000000000000000000000..eb5971a0ccfdd37bd243bcb7de38a8ea828a4c69
--- /dev/null
+++ b/src/utils_char.F90
@@ -0,0 +1,93 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!----
+
+!> @brief Utilities for character manipulation
+
+Module utils_char
+
+  implicit none
+
+Contains
+!!$============================================================
+  !> @brief convert to lowercase
+!!$============================================================
+  Subroutine Lowercase(STR)
+    implicit none
+    Character(LEN=*), intent(IN OUT) :: STR
+    Integer :: I, DEL
+!!$------------------------------------------------------------
+    DEL = IACHAR('a') - IACHAR('A')
+
+    DO I = 1, LEN_TRIM(STR)
+       IF (LGE(STR(I:I),'A') .AND. LLE(STR(I:I),'Z')) THEN
+          STR(I:I) = ACHAR(IACHAR(STR(I:I)) + DEL)
+       END IF
+    END DO
+    RETURN
+  End Subroutine Lowercase
+
+  
+!!$============================================================
+  !> @brief Remove white trailing spaces
+!!$============================================================  
+  subroutine noblancs (a, n)
+    implicit none
+    character a*(*)
+    integer n, lena, i, i1
+!!$------------------------------------------------------------
+    lena = len(a)
+    Do  i = 1, lena
+       If (a(i : i) .ne. ' ') go to 2
+    end do
+    Stop '  noblancs: blanc string!'
+
+2   i1 = i
+    If (i1 .eq. lena) then
+       n = 1
+    Else
+       Do  i = i1 + 1, lena
+          If(a(i : i) .eq. ' ') go to 4
+       end do
+       i = lena + 1
+4      n = i - i1
+    EndIf
+
+    If ( n .eq. lena ) Return
+
+    Do  i = 1, n
+       a(i : i) = a(i + i1 - 1 : i + i1 - 1)
+    end do
+    Do  i = n + 1, lena
+       a(i : i)=' '
+    end do
+
+    Return
+  End subroutine noblancs
+!!$============================================================
+End Module utils_char
diff --git a/src/utils_det.F90 b/src/utils_det.F90
new file mode 100644
index 0000000000000000000000000000000000000000..af6bd792e7d981dcda0149a09dd93e49350fcc04
--- /dev/null
+++ b/src/utils_det.F90
@@ -0,0 +1,170 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!$============================================================
+!> @brief Utilitaires pour le traitement des determinants
+!> deteq : teste egalite de deux dets 
+!> detord : teste et ordonne les dets
+!> detzero : met un det a zero
+!> vdetzero : met un vecteur de det à zéro
+!$============================================================
+Module utils_det
+
+  use typedet
+  
+  implicit none
+
+Contains
+    
+  
+!!$============================================================
+  !> @brief test equality of 2 determinants
+  !> @author 
+  !> @param[in] det1
+  !> @param[in] det2
+  !> @return boolean
+  Logical function deteq(det1,det2)
+    !------------------------------------------------------------
+    ! Teste l'égalité de 2 dets
+    ! -------- Donness globales ---------------------------------
+    use info
+    ! -------- Donnes locales -----------------------------------
+    Type (deter), intent(in) :: det1,det2
+    Integer (KIND=kd_int) :: i,j
+    Logical, dimension(2) :: vf
+    ! -------- Code ---------------------------------------------
+    deteq = .true.
+
+    if (det1%detact.ne.det2%detact) then 
+       deteq = .false.
+       return
+    end if
+
+    vf(:) = .true.
+    do j = 1,2
+       do i = 1,2
+          if (det1%dettr(j).eq.det2%dettr(i) .and. vf(i)) then
+             vf(i) = .false.
+             goto 1
+          end if
+       end do
+       deteq = .false.
+       return
+1      continue
+    end do
+
+    vf(:) = .true.
+    do j = 1,2
+       do i = 1,2
+          if (det1%detprt(j).eq.det2%detprt(i) .and. vf(i)) then
+             vf(i) = .false.
+             goto 2
+          end if
+       end do
+       deteq = .false.
+       return
+2      continue
+    end do
+
+  end function deteq
+!!$============================================================
+  subroutine detord(detin,detout,signe)
+    !------------------------------------------------------------
+    ! Teste  et ordonne les dets
+    ! -------- Donness globales ---------------------------------
+    use info
+    ! -------- Donnes locales -----------------------------------
+    Type (deter), intent(in) :: detin
+    Type (deter), intent(out) :: detout
+    Integer (KIND=kd_int), intent(out) :: signe
+
+    Integer (KIND=kd_int) :: i,j
+    Logical, dimension(2) :: vf
+    ! -------- Code ---------------------------------------------
+    detout%detact = detin%detact
+    signe = 1
+
+    if (detin%dettr(1).eq.detin%dettr(2)) then 
+       stop ">>> Det invalide <<<"
+    else if (detin%dettr(1).gt.detin%dettr(2)) then 
+       detout%dettr(1) = detin%dettr(2)
+       detout%dettr(2) = detin%dettr(1)
+       signe = - signe
+    else
+       detout%dettr(:) = detin%dettr(:)
+    end if
+
+    if (detin%detprt(1).eq.detin%detprt(2)) then 
+       stop ">>> Det invalide <<<"
+    else if (detin%detprt(1).gt.detin%detprt(2)) then 
+       detout%detprt(1) = detin%detprt(2)
+       detout%detprt(2) = detin%detprt(1)
+       signe = - signe
+    else
+       detout%detprt(:) = detin%detprt(:)
+    end if
+
+  end subroutine detord
+!!$============================================================
+  subroutine detzero(det)
+    !------------------------------------------------------------
+    ! Met un det à zéro
+    ! -------- Donness globales ---------------------------------
+    use info
+    ! -------- Donnes locales -----------------------------------
+    Type (deter), intent(inout) :: det
+    ! -------- Code ---------------------------------------------
+    det%detact    = 0
+    det%dettr(:)  = 0
+    det%detprt(:) = 0
+  end subroutine detzero
+!!$============================================================
+  subroutine vdetzero(vdet,ndim)
+    !------------------------------------------------------------
+    ! Met un det à zéro
+    ! -------- Donness globales ---------------------------------
+    use info
+    ! -------- Donnes locales -----------------------------------
+    Type (deter), dimension(ndim), intent(inout) :: vdet
+    Integer, intent(in) :: ndim
+    Integer :: i
+    ! -------- Code ---------------------------------------------
+    do i = 1,ndim
+       vdet(i)%detact    = 0
+       vdet(i)%dettr(:)  = 0
+       vdet(i)%detprt(:) = 0
+    end do
+  end subroutine vdetzero
+!!$============================================================
+
+  
+end Module utils_det
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/utils_twoint.F90 b/src/utils_twoint.F90
new file mode 100644
index 0000000000000000000000000000000000000000..ddcd672413693ac338a02490a6f024fb994cab6a
--- /dev/null
+++ b/src/utils_twoint.F90
@@ -0,0 +1,605 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!$============================================================
+!> @brief Utils for the two-electron integrals
+!$============================================================
+module utils_twoint
+
+  use info
+  use files
+  use type_twoint
+  use detact
+  use spindetact
+  use typedet
+  use typetargetvec
+  use typebraket
+  
+  implicit none
+
+contains
+
+  !$======================================================================== 
+  !> @brief Get the intkind object coresponding to 'name'
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !
+  !> @param[in] intkindlist Array of intkind_H
+  !> @param[in] name Name of the integral e.g. aaao
+  !> @param[in] nintkind Nb of intkind_H in the list
+  !> @param[out] intkind Intkind_H object 
+  !$======================================================================== 
+  subroutine get_intkind(intkindlist, name, nintkind, intkind)
+    
+    type(intkind_H), dimension(:), allocatable, intent(in) :: intkindlist
+    character(4), intent(in)                               :: name
+    integer, intent(in)                                    :: nintkind
+    type(intkind_H), intent(out)                           :: intkind
+
+    integer :: i
+
+    do i = 1, nintkind
+       if (intkindlist(i)%name .eq. name) then
+          intkind = intkindlist(i)
+          return
+       endif
+    enddo
+  end subroutine get_intkind
+
+  !$======================================================================== 
+  !> @brief Initialise the list of all intkind needed for HV blocs
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !
+  !> @param[out] intkindlist Array of intkind_H
+  !> @param[in] int_info Info about the integrals
+  !$======================================================================== 
+  subroutine intkind_H_all_init(intkindlist, int_info)
+
+    type(intkind_H), dimension(:), allocatable, intent(out) :: intkindlist
+    type(int_infotype), intent(in) :: int_info
+
+    integer :: i, nintkind
+
+    nintkind = int_info%CASS_nintkind
+    allocate(intkindlist(nintkind))
+
+    do i = 1, nintkind
+       intkindlist(i)%name = int_info%CASS_intkind(i)
+       select case (intkindlist(i)%name)
+       case ('fock')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 0
+       case ('oooo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('aooo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('aaoo')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'aoao'
+          intkindlist(i)%ijkl_type = 2
+       case ('aoao')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('aaao')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 1
+       case ('aaaa')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vaoo')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'voao'
+          intkindlist(i)%ijkl_type = 2
+       case ('voao')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vaao')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'voaa'
+          intkindlist(i)%ijkl_type = 2
+       case ('vaaa')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vava')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vvaa')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'vava'
+          intkindlist(i)%ijkl_type = 2
+       case ('vvoo')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'vovo'
+          intkindlist(i)%ijkl_type = 2
+       case ('vovo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vavo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 1
+       case ('vvao')
+          intkindlist(i)%lintx = .true.
+          intkindlist(i)%namex = 'vavo'
+          intkindlist(i)%ijkl_type = 1
+       case ('vvvo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 1  
+       case ('vvva')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 1
+       case ('vvvv')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case ('vooo')
+          intkindlist(i)%lintx = .false.
+          intkindlist(i)%namex = ''
+          intkindlist(i)%ijkl_type = 2
+       case default
+          write(*,*) 'intkind_H_all_init', (intkindlist(i)%name)
+          call SASS_quit('intkind_H_all_init', f_output)
+       end select
+    enddo
+  end subroutine intkind_H_all_init
+
+  !$======================================================================== 
+  !> @brief Free the list of all intkind needed for HV blocs
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !
+  !> @param[inout] intkindlist Array of intkind_H
+  !$======================================================================== 
+  subroutine intkind_H_all_free(intkindlist)
+
+    type(intkind_H), dimension(:), allocatable, intent(inout) :: intkindlist
+
+    deallocate(intkindlist)
+
+  end subroutine intkind_H_all_free
+
+  !$======================================================================== 
+  !> @brief Write an intcase to file f_output
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !
+  !> @param[inout] intkindlist Array of intkind_H
+  !$======================================================================== 
+  subroutine wrt_intcase(dblockI, dblockJ, intkind, actcase, Hij, fid)
+
+    type(deter_dblock), pointer, intent(in)    :: DblockI, DblockJ
+    type(intkind_H), intent(in)                :: intkind
+    integer, intent(in)                        :: actcase
+    type(braket), intent(in)                   :: Hij
+    integer, intent(in)                        :: fid
+    
+
+    write(fid,'(A,A,A,X)',advance="no") "'",intkind%name,"'"
+    write(fid,'(A,I0,X,A,I0,X)',advance="no") "D",DblockI%name,' - D',DblockJ%name
+    write(fid,'(A,I0,X)',advance="no") 'tcase=',Hij%tcase
+    write(fid,'(A,I0,X)',advance="no") 'pcase=',Hij%pcase
+    write(fid,'(A,I0,X)',advance="no") 'actcase=',actcase
+    if (Hij%p1 .gt. 0) then
+       write(fid,'(A,I0)',advance="no") 'p1=',Hij%p1
+       if (Hij%spinp1 .eq. 1) then
+          write(fid,'(A)',advance="no") 'u '
+       else
+          write(fid,'(A)',advance="no") 'd '
+       endif
+       if (Hij%p2 .gt. 0) then
+          write(fid,'(A,I0)',advance="no") 'p2=',Hij%p2
+          if (Hij%spinp2 .eq. 1) then
+             write(fid,'(A)',advance="no") 'u '
+          else
+             write(fid,'(A)',advance="no") 'd '
+          endif
+       endif
+    endif
+    if (Hij%p3 .gt. 0) then
+       write(fid,'(A,I0)',advance="no") 'p3=',Hij%p3
+       if (Hij%spinp3 .eq. 1) then
+          write(fid,'(A)',advance="no") 'u '
+       else
+          write(fid,'(A)',advance="no") 'd '
+       endif
+       if (Hij%p4 .gt. 0) then
+          write(fid,'(A,I0)',advance="no") 'p4=',Hij%p4
+          if (Hij%spinp4 .eq. 1) then
+             write(fid,'(A)',advance="no") 'u '
+          else
+             write(fid,'(A)',advance="no") 'd '
+          endif
+       endif
+    endif
+    
+    if (Hij%t1 .gt. 0) then
+       write(fid,'(A,I0)',advance="no") 't1=',Hij%t1
+       if (Hij%spint1 .eq. 1) then
+          write(fid,'(A)',advance="no") 'u '
+       else
+          write(fid,'(A)',advance="no") 'd '
+       endif
+       if (Hij%t2 .gt. 0) then
+          write(fid,'(A,I0)',advance="no") 't2=',Hij%t2
+          if (Hij%spint2 .eq. 1) then
+             write(fid,'(A)',advance="no") 'u '
+          else
+             write(fid,'(A)',advance="no") 'd '
+          endif
+       endif
+    endif
+    if (Hij%t3 .gt. 0) then
+       write(fid,'(A,I0)',advance="no") 't3=',Hij%t3
+       if (Hij%spint3 .eq. 1) then
+          write(fid,'(A)',advance="no") 'u '
+       else
+          write(fid,'(A)',advance="no") 'd '
+       endif
+       if (Hij%t4 .gt. 0) then
+          write(fid,'(A,I0)',advance="no") 't4=',Hij%t4
+          if (Hij%spint4 .eq. 1) then
+             write(fid,'(A)',advance="no") 'u '
+          else
+             write(fid,'(A)',advance="no") 'd '
+          endif
+       endif
+    endif
+   
+    write(fid,*) ''
+    
+  end subroutine wrt_intcase
+
+  
+  !$======================================================================== 
+  !> @brief Write the two-electron integral numbers for each kind
+  !> @author Elisa Rebolini
+  !> @date November 2018
+  !
+  !> @param[in] fid File ID
+  !> @param[in] int_info Info about the integrals
+  !$======================================================================== 
+  subroutine write_ntwoint(fid, int_info)
+
+    integer, intent(in)            :: fid
+    type(int_infotype), intent(in) :: int_info
+
+    write(fid,*) ' Total nb of 2e- integrals   ', int_info%n_2int
+    write(fid,*) ' (oo|oo)                     ', int_info%n_oooo
+    write(fid,*) ' (ao|oo)                     ', int_info%n_aooo
+    write(fid,*) ' (aa|oo) and (ao|ao)         ', int_info%n_aaoo &
+         + int_info%n_aoao 
+    write(fid,*) ' (aa|ao)                     ', int_info%n_aaao 
+    write(fid,*) ' (aa|aa)                     ', int_info%n_aaaa
+    write(fid,*) ' (vo|oo)                     ', int_info%n_vooo
+    write(fid,*) ' (va|oo) and (vo|ao)         ', int_info%n_vaoo &
+         + int_info%n_voao
+    write(fid,*) ' (va|ao) and (vo|aa)         ', int_info%n_vaao &
+         + int_info%n_voaa
+    write(fid,*) ' (va|aa)                     ', int_info%n_vaaa
+    write(fid,*) ' (vv|oo) and (vo|vo)         ', int_info%n_vvoo &
+         + int_info%n_vovo
+    write(fid,*) ' (vv|ao), and (va|vo)        ', int_info%n_vvao &
+         + int_info%n_vavo 
+    write(fid,*) ' (vv|aa) and (va|va)         ', int_info%n_vvaa &
+         + int_info%n_vava
+    write(fid,*) ' (vv|vo)                     ', int_info%n_vvvo
+    write(fid,*) ' (vv|va)                     ', int_info%n_vvva
+    write(fid,*) ' (vv|vv)                     ', int_info%n_vvvv
+
+    write(fid,*) ' gelees                      ', int_info%n_gint
+    
+
+  end subroutine write_ntwoint
+  
+  !$====================================================================
+  !> @brief Read a 2e- integral block from file
+  !> @author Elisa Rebolini
+  !> @date Apr 2018
+  !$
+  !> @param[out] a integral block to be read
+  !> @param[in] atype type of integrals : 'oooo', 'aaoo'...
+  !> @param[in] o_info Orbital information
+  !> @param[in] int_info Integral information
+  !$==================================================================== 
+  subroutine get_twoint(a, atype, o_info, int_info, id_cpu)
+    
+    type(intblock), intent(out)          :: a
+    character*4, intent(in)              :: atype
+    type(o_infotype), intent(in)         :: o_info
+    type(int_infotype), intent(in)       :: int_info
+    integer, intent(in)                  :: id_cpu
+
+    integer :: no,na,nv,ng
+    integer :: shifti, shiftj, shiftk, shiftl, ni, nj, nk, nl, nelms
+    integer :: iunit
+
+    ng = o_info%ngel
+    no = o_info%nocc + o_info%nligo
+    na = o_info%nact
+    nv = o_info%nvirt + o_info%nligv
+    
+    select case (atype)
+    case ('oooo')
+       nelms = int_info%n_oooo
+       iunit = uf_oooo
+       shifti = ng
+       shiftj = ng
+       shiftk = ng
+       shiftl = ng
+       ni = no
+       nj = no
+       nk = no
+       nl = no
+    case ('aooo')
+       nelms = int_info%n_aooo
+       iunit = uf_aooo
+       shifti = no+ng
+       shiftj = ng
+       shiftk = ng
+       shiftl = ng
+       ni = na
+       nj = no
+       nk = no
+       nl = no
+    case ('vooo')
+       nelms = int_info%n_vooo
+       iunit = uf_vooo
+       shifti = no+na+ng
+       shiftj = ng
+       shiftk = ng
+       shiftl = ng
+       ni = nv
+       nj = no
+       nk = no
+       nl = no
+    case ('aaoo')
+       nelms = int_info%n_aaoo
+       iunit = uf_aaoo
+       shifti = no+ng
+       shiftj = no+ng
+       shiftk = ng
+       shiftl = ng
+       ni = na
+       nj = na
+       nk = no
+       nl = no
+     case ('aaao')
+       nelms = int_info%n_aaao
+       iunit = uf_aaao
+       shifti = no+ng
+       shiftj = no+ng
+       shiftk = no+ng
+       shiftl = ng
+       ni = na
+       nj = na
+       nk = na
+       nl = no
+     case ('aoao')
+       nelms = int_info%n_aoao
+       iunit = uf_aoao
+       shifti = no+ng
+       shiftj = ng
+       shiftk = no+ng
+       shiftl = ng
+       ni = na
+       nj = no
+       nk = na
+       nl = no
+    case ('vaoo')
+       nelms = int_info%n_vaoo
+       iunit = uf_vaoo
+       shifti = no+na+ng
+       shiftj = no+ng
+       shiftk = ng
+       shiftl = ng
+       ni = nv
+       nj = na
+       nk = no
+       nl = no
+     case ('voao')
+       nelms = int_info%n_voao
+       iunit = uf_voao
+       shifti = no+na+ng
+       shiftj = ng
+       shiftk = no+ng
+       shiftl = ng
+       ni = nv
+       nj = no
+       nk = na
+       nl = no
+    case ('vaao')
+       nelms = int_info%n_vaao
+       iunit = uf_vaao
+       shifti = no+na+ng
+       shiftj = no+ng
+       shiftk = no+ng
+       shiftl = ng
+       ni = nv
+       nj = na
+       nk = na
+       nl = no   
+    case ('vvoo')
+       nelms = int_info%n_vvoo
+       iunit = uf_vvoo
+       shifti = no+na+ng
+       shiftj = no+na+ng
+       shiftk = ng
+       shiftl = ng
+       ni = nv
+       nj = nv
+       nk = no
+       nl = no
+     case ('vovo')
+       nelms = int_info%n_vovo
+       iunit = uf_vovo
+       shifti = no+na+ng
+       shiftj = ng
+       shiftk = no+na+ng
+       shiftl = ng
+       ni = nv
+       nj = no
+       nk = nv
+       nl = no
+    case ('vvvo')
+       nelms = int_info%n_vvvo
+       iunit = uf_vvvo
+       shifti = no+na+ng
+       shiftj = no+na+ng
+       shiftk = no+na+ng
+       shiftl = ng
+       ni = nv
+       nj = nv
+       nk = nv
+       nl = no
+    case ('vvva')
+       nelms = int_info%n_vvva
+       iunit = uf_vvva
+       shifti = no+na+ng
+       shiftj = no+na+ng
+       shiftk = no+na+ng
+       shiftl = no+ng
+       ni = nv
+       nj = nv
+       nk = nv
+       nl = na
+    case ('aaaa')
+       nelms = int_info%n_aaaa
+       iunit = uf_aaaa
+       shifti = no+ng
+       shiftj = no+ng
+       shiftk = no+ng
+       shiftl = no+ng
+       ni = na
+       nj = na
+       nk = na
+       nl = na
+    case ('voaa')
+       nelms = int_info%n_voaa
+       iunit = uf_voaa
+       shifti = na+no+ng
+       shiftj = ng
+       shiftk = no+ng
+       shiftl = no+ng
+       ni = nv
+       nj = no
+       nk = na
+       nl = na
+    case ('vaaa')
+       nelms = int_info%n_vaaa
+       iunit = uf_vaaa
+       shifti = na+no+ng
+       shiftj = no+ng
+       shiftk = no+ng
+       shiftl = no+ng
+       ni = nv
+       nj = na
+       nk = na
+       nl = na
+    case ('vvao')
+       nelms = int_info%n_vvao
+       iunit = uf_vvao
+       shifti = no+na+ng
+       shiftj = no+na+ng
+       shiftk = ng+no
+       shiftl = ng
+       ni = nv
+       nj = nv
+       nk = na
+       nl = no
+    case ('vavo')
+       nelms = int_info%n_vavo
+       iunit = uf_vavo
+       shifti = no+na+ng
+       shiftj = ng+no
+       shiftk = no+na+ng
+       shiftl = ng
+       ni = nv
+       nj = na
+       nk = nv
+       nl = no
+    case ('vvaa')
+       nelms = int_info%n_vvaa
+       iunit = uf_vvaa
+       shifti = no+na+ng
+       shiftj = no+na+ng
+       shiftk = ng+no
+       shiftl = ng+no
+       ni = nv
+       nj = nv
+       nk = na
+       nl = na
+     case ('vava')
+       nelms = int_info%n_vava
+       iunit = uf_vava
+       shifti = no+na+ng
+       shiftj = ng+no
+       shiftk = no+na+ng
+       shiftl = ng+no
+       ni = nv
+       nj = na
+       nk = nv
+       nl = na
+    case ('vvvv')
+       nelms = int_info%n_vvvv
+       iunit = uf_vvvv
+       shifti = no+na+ng
+       shiftj = ng+no+na
+       shiftk = no+na+ng
+       shiftl = ng+no+na
+       ni = nv
+       nj = nv
+       nk = nv
+       nl = nv
+    case default
+       write(*,*) atype
+       stop "get_twoint : case to be implemented"
+    end select
+       
+    call intblock_init(a,shifti,shiftj,shiftk,shiftl,ni,nj,nk,nl,nelms)
+
+    call intblock_fromfile(a,iunit,id_cpu)
+
+  end subroutine get_twoint
+  
+end module utils_twoint
diff --git a/src/utils_wrt.F90 b/src/utils_wrt.F90
new file mode 100644
index 0000000000000000000000000000000000000000..9154821e07d8f30bcc1605b782fafb0369ded657
--- /dev/null
+++ b/src/utils_wrt.F90
@@ -0,0 +1,457 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+!$============================================================
+!> @brief Utilitaires pour le traitement des I/O
+!! Wrtdet : écrit un det
+!! Wrtact : écrit la partie active d'un det
+!! Wrtactalpha  : Ecriture partie active alpha des det
+!! Wrtmat : Ecriture matrice réelle 
+!$============================================================
+
+module utils_wrt
+
+  use typedet
+  use info
+  
+  implicit none
+  private
+  
+  public :: &
+       wrt_deter_block, &
+       wrtdet, &
+       wrtact, &
+       wrtactalpha, &
+       wrtmat, wrtmat_accurate, wrtmatE, wrt_bdet, wrt_info 
+  
+  ! interface  wrt_bdet
+  !    module procedure wrt_bdet
+  ! end interface wrt_bdet
+  
+  interface wrtdet
+     module procedure wrtdet_global, wrtdet_local
+  end interface wrtdet
+
+  interface wrt_deter_block
+     module procedure wrt_deter_dblock
+  end interface wrt_deter_block
+     
+contains
+  
+!!$  !$==================================================================== 
+!!$  !> @brief Print a deter_block object
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Nov 2017
+!!$  !$==================================================================== 
+!!$  subroutine wrt_deter_tblock(d, iout, o_info)
+!!$
+!!$    implicit none
+!!$
+!!$    type(deter_tblock), intent(in) :: d
+!!$    integer, intent(in)           :: iout
+!!$    type(o_infotype), optional, intent(in) :: o_info
+!!$    
+!!$    integer :: i
+!!$    
+!!$    write(iout,'(A,I0)') 'Determinant block T', d%name
+!!$    !write(iout,'(X,I0,X,A)') d%nelCAS,'extra active electrons'
+!!$    write(iout,*) 'Act   Occ   Ligo  Ligv  Virt'
+!!$    write(iout,'(X,(I2,4X),4(I1,5X))') d%nelCAS, d%nexcOcc, d%nexcLigo, &
+!!$         d%nexcLigv, d%nexcVirt
+!!$    write(iout,'(A,I0,A)') 'contains ',d%ndet,' determinants'
+!!$    write(iout,*) ''
+!!$    if (associated(d%elms)) then
+!!$       if ((present(o_info)) .and. (d%ndet .ne. 0)) then
+!!$          do i = 1, d%ndet
+!!$             call wrtdet(d%elms(i), iout, o_info)
+!!$          enddo
+!!$       endif
+!!$    endif
+!!$        
+!!$  end subroutine wrt_deter_tblock
+
+  !$==================================================================== 
+  !> @brief Print a deter_block object
+  !> @author Elisa Rebolini
+  !> @date Nov 2017
+  !$==================================================================== 
+  subroutine wrt_deter_dblock(d, iout, o_info)
+
+    implicit none
+
+    type(deter_dblock), intent(in) :: d
+    integer, intent(in)           :: iout
+    type(o_infotype), optional, intent(in) :: o_info
+    
+    integer :: i
+    
+    write(iout,'(A,I0)') 'Determinant block D', d%name
+    !write(iout,'(X,I0,X,A)') d%nelCAS,'extra active electrons'
+    write(iout,*) 'Act   Occ   Virt'
+    write(iout,'(X,(I2,4X),2(I1,5X))') d%nelCAS, d%nexcOcc, d%nexcVirt
+    write(iout,'(A,I0,A)') 'contains ',d%ndet,' determinants'
+    write(iout,*) ''
+    if (associated(d%elms)) then
+       if ((present(o_info)) .and. (d%ndet .ne. 0)) then
+          do i = 1, d%ndet
+             call wrtdet(d%elms(i), iout, o_info)
+          enddo
+       endif
+    endif
+        
+  end subroutine wrt_deter_dblock
+  !$============================================================
+  !> @brief Write all determinants in binary file 
+  !> @author MBL
+  !> @date avril 2020
+  !> @param
+  !> @param
+  !$============================================================
+  subroutine wrt_bdet(det,ndet,iunit)
+    ! -------- Donnes locales -----------------------------------
+    Implicit none
+    integer, intent(in) :: ndet
+    Type(deter), dimension(ndet), intent(in)     :: det
+    integer, intent(in)         :: iunit
+    integer :: idet
+    
+    do idet = 1,ndet
+       write(iunit) det(idet)%detact, det(idet)%dettr,  det(idet)%detprt
+    end do
+    
+  end subroutine wrt_bdet
+  !$============================================================
+  !> @brief Write x_info types in binary file 
+  !> @author MBL
+  !> @date avril 2020
+  !> @param
+  !> @param
+  !$============================================================
+  subroutine wrt_info(prog_info,g_info,o_info,v_info,det_info,d,sym_info,iunit)
+    ! -------- Donnes locales -----------------------------------
+    Implicit none
+    type(prog_infotype), intent(in) :: prog_info
+    type(g_infotype),    intent(in) :: g_info
+    type(o_infotype),    intent(in) :: o_info
+    type(v_infotype),    intent(in) :: v_info
+    type(det_infotype),  intent(in) :: det_info
+    type(deter_dblocklist),intent(in):: d
+    type(sym_infotype),  intent(in) :: sym_info
+    integer,             intent(in) :: iunit
+
+    integer :: nblock, i 
+    Integer, dimension(:), allocatable :: shtblkdet, nblkdet, deter_index
+
+    nblock = d%nblock
+    allocate(shtblkdet(nblock), nblkdet(nblock), deter_index(nblock))
+    do i=1,nblock
+       shtblkdet(i)   = d%detblock(i)%p%shift
+       nblkdet(i)     = d%detblock(i)%p%ndet
+       deter_index(i) = d%deter_index(i)
+    end do
+
+    write(iunit) prog_info
+    write(iunit) g_info
+    write(iunit) o_info
+    write(iunit) v_info
+    write(iunit) det_info
+    write(iunit) nblock
+    write(iunit) shtblkdet(1:nblock), nblkdet(1:nblock), deter_index(1:nblock) 
+    write(iunit) sym_info
+    
+  end subroutine wrt_info
+  !$============================================================
+  !> @brief Write a determinant using the global variables
+  !> @author
+  !> @date
+  !> @param
+  !> @param
+  !$============================================================
+  subroutine wrtdet_global(d, iunit, o_info)  
+        
+    ! -------- Donnes locales -----------------------------------
+    Implicit none
+    Type(deter), intent(in)     :: d
+    integer, intent(in)         :: iunit
+    type(o_infotype), intent(in):: o_info
+
+    call wrtdet_local(d, iunit, o_info%ngel, o_info%nocc, &
+         o_info%nligo, o_info%nact, o_info%nligv, &
+         o_info%nvirt, o_info%ndel)
+    
+  end subroutine wrtdet_global
+
+  !$============================================================
+  !> @brief Write a determinant without using the global variables
+  !> @author
+  !> @date
+  !> @param
+  !> @param
+  !$============================================================
+  subroutine wrtdet_local(d, iunit, lngel, lnocc, lnligo, lnact, &
+       lnligv, lnvirt, lndel)
+
+    ! -------- Donnes locales -----------------------------------
+    implicit none
+    type(deter), intent(in) :: d
+    integer, intent(in) :: iunit
+    integer, intent(in) :: lngel, lnocc, lnligo, lnact, lnligv, &
+         lnvirt, lndel   
+    
+    integer :: ibit, it1,it2,ip1,ip2, ishpa, ishpb, ishta, ishtb
+    Character*1 :: spt1, spt2, spp1, spp2
+    ! -------- Code ---------------------------------------------
+
+    do ibit = 0,lnact-1
+       write(iunit,'(i1)',advance='no') ibits(d%detact, ibit, 1)
+    end do
+    write(iunit,'(" ")',advance='no')
+    do ibit = lnact, 2*lnact-1
+       write(iunit,'(i1)',advance='no') ibits(d%detact, ibit, 1)
+    end do
+    write(iunit,'(" ")',advance='no')
+
+    ! trous et particules
+    ishta = 2*lngel
+    ishtb = 2*lngel + lnocc + lnligo
+    ishpa = 2*lngel + 2*lnocc + 2*lnligo + 2*lnact 
+    ishpb = 2*lngel + 2*lnocc + 2*lnligo + 2*lnact + lnligv + lnvirt
+
+    if (d%dettr(1).le.ishtb) then  
+       it1  = d%dettr(1) - lngel
+       spt1 = 'u'
+    else 
+       it1  = d%dettr(1) - lngel - lnocc - lnligo
+       spt1 = 'd'
+    end if
+    if (d%dettr(2).le.ishtb) then
+       it2  = d%dettr(2) - lngel
+       spt2 = 'u'
+    else 
+       it2  = d%dettr(2) - lngel - lnocc - lnligo
+       spt2 = 'd'
+    end if
+
+    if (d%detprt(1).le.ishpb) then
+       ip1  = d%detprt(1) - lngel - lnocc - lnligo - lnact
+       spp1 = 'u'
+    else 
+       ip1  = d%detprt(1) - lngel - lnocc - lnligo - lnact - lnligv - lnvirt
+       spp1 = 'd'
+    end if
+    if (d%detprt(2).le.ishpb) then
+       ip2  = d%detprt(2) - lngel  - lnocc - lnligo - lnact
+       spp2 = 'u'
+    else 
+       ip2  = d%detprt(2) - lngel - lnocc - lnligo - lnact - lnligv - lnvirt
+       spp2 = 'd'
+    end if
+
+    if (d%dettr(1).eq.0 .and. d%dettr(2).ne.0) then 
+       write(iunit,9022) d%dettr,d%detprt   
+       call SASS_quit(">>> Erreur det <<<",f_output)
+    else if (d%detprt(1).eq.0 .and. d%detprt(2).ne.0) then 
+       write(iunit,9022) d%dettr,d%detprt   
+       call SASS_quit(">>> Erreur det <<<",f_output)
+    else if (d%dettr(1).eq.0 .and. d%dettr(2).eq.0) then 
+       if (d%detprt(1).eq.0 .and. d%detprt(2).eq.0) then
+          write(iunit,*)
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).eq.0) then
+          write(iunit,9001) ip1,spp1
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).ne.0) then
+          write(iunit,9002) ip1,spp1, ip2,spp2
+          return
+       end if
+    else if (d%dettr(1).ne.0 .and. d%dettr(2).eq.0) then 
+       if (d%detprt(1).eq.0 .and. d%detprt(2).eq.0) then
+          write(iunit,9010) it1,spt1  
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).eq.0) then
+          write(iunit,9011)  it1,spt1, ip1,spp1    
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).ne.0) then
+          write(iunit,9012)  it1,spt1, ip1,spp1, ip2,spp2
+          return
+       end if
+    else if (d%dettr(1).ne.0 .and. d%dettr(2).ne.0) then 
+       if (d%detprt(1).eq.0 .and. d%detprt(2).eq.0) then
+          write(iunit,9020)  it2,spt2, it1,spt1
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).eq.0) then
+          write(iunit,9021)  it2,spt2, it1,spt1, ip1,spp1
+          return
+       else if (d%detprt(1).ne.0 .and. d%detprt(2).ne.0) then
+          write(iunit,9022) it2,spt2, it1,spt1, ip1,spp1,  ip2,spp2
+          return
+       end if
+    end if
+
+9001 format(17x,"  ->  ",I5,a1)
+9002 format(17x,"  ->  ",I5,a1," , ",i5,a1)
+9010 format(11x,i5,a1,"  ->  ")
+9011 format(11x,i5,a1,"  ->  ",I5,a1)
+9012 format(11x,i5,a1,"  ->  ",I5,a1," , ",i5,a1)
+9020 format(2x,i5,a1," , ",i5,a1,"  ->  ")
+9021 format(2x,i5,a1," , ",i5,a1,"  ->  ",I5,a1)
+9022 format(2x,I5,a1," , ",i5,a1,"  ->  ",I5,a1," , ",i5,a1)
+  end subroutine wrtdet_local
+
+  
+!!$============================================================
+  Subroutine wrtact(dact, iunit, yno, nact)  
+    !------------------------------------------------------------
+    ! Ecriture partie active des det
+    ! -------- Donnes locales -----------------------------------
+    Implicit none
+    Integer(Kind= kindact), intent(in) :: dact
+    integer, intent(in)                :: iunit, nact
+    logical, intent(in)                :: yno
+    
+    integer ::  ibit
+        
+    ! -------- Code ---------------------------------------------
+    do ibit = 0,NACT-1
+       write(iunit,'(i1)',advance='no') ibits(dact, ibit, 1)
+    end do
+    write(iunit,'(" ")',advance='no')
+    do ibit = nact, 2*nact-1
+       write(iunit,'(i1)',advance='no') ibits(dact, ibit, 1)
+    end do
+    if (.not.yno) write(iunit,*)
+  end Subroutine wrtact
+  
+!!$============================================================
+  Subroutine wrtactalpha(dact, iunit, yno, nact)  
+    !------------------------------------------------------------
+    ! Ecriture partie active alpha des det
+    ! -------- Donnes locales -----------------------------------
+    Implicit none
+    Integer(Kind= kindact), intent(in) :: dact
+    integer, intent(in)                :: iunit, nact
+    logical, intent(in)                :: yno
+    
+    integer :: ibit
+    
+    ! -------- Code ---------------------------------------------
+    do ibit = 0,nact-1
+       write(iunit,'(i1)',advance='no') ibits(dact, ibit, 1)
+    end do
+    if (.not.yno) write(iunit,*)
+  end Subroutine wrtactalpha
+       
+!!$============================================================
+  Subroutine wrtmat(mat, dimmaxi, dimi, dimj, iunit)  
+    !------------------------------------------------------------
+    ! Ecriture matrice réelle 
+    ! -------- Donnes locales -----------------------------------
+
+    Implicit none
+    Integer (KIND=kd_int), intent(in) :: dimmaxi, dimi, dimj, iunit
+    Real (KIND=kd_dble), dimension(dimmaxi,dimj), intent(in) :: mat
+    Integer (KIND=kd_int) :: i,j,npas, kpas
+    ! -------- Code ---------------------------------------------
+    npas = dimj/10
+    if (npas.eq.0) goto 10
+    do kpas = 1,npas
+       do i = 1, dimi
+          write(iunit,9993)   (mat(i,j), j=(kpas-1)*10+1,kpas*10)
+       end do
+       write(iunit,*)
+    end do
+    
+10  if (mod(dimj,10).eq.0) return 
+    do i = 1, dimi
+       write(iunit,9993)   (mat(i,j), j=npas*10+1,dimj)
+    end do
+    
+9993 format (5x,10(F12.6,1x))        
+  end Subroutine wrtmat
+
+
+  !$============================================================
+  Subroutine wrtmat_accurate(mat, dimmaxi, dimi, dimj, iunit)  
+    !------------------------------------------------------------
+    ! Ecriture matrice réelle 
+    ! -------- Donnes locales -----------------------------------
+
+    Implicit none
+    Integer (KIND=kd_int), intent(in) :: dimmaxi, dimi, dimj, iunit
+    Real (KIND=kd_dble), dimension(dimmaxi,dimj), intent(in) :: mat
+    Integer (KIND=kd_int) :: i,j,npas, kpas
+    ! -------- Code ---------------------------------------------
+    npas = dimj/10
+    if (npas.eq.0) goto 10
+    do kpas = 1,npas
+       do i = 1, dimi
+          write(iunit,9993)   (mat(i,j), j=(kpas-1)*10+1,kpas*10)
+       end do
+       write(iunit,*)
+    end do
+    
+10  if (mod(dimj,10).eq.0) return 
+    do i = 1, dimi
+       write(iunit,9993)   (mat(i,j), j=npas*10+1,dimj)
+    end do
+    
+9993 format (5x,10(F22.16,1x))        
+  end Subroutine wrtmat_accurate
+!!$============================================================
+  Subroutine wrtmatE(mat, dimmaxi, dimi, dimj, iunit)  
+    !------------------------------------------------------------
+    ! Ecriture matrice réelle 
+    ! -------- Donnes locales -----------------------------------
+
+    Implicit none
+    Integer (KIND=kd_int), intent(in) :: dimmaxi, dimi, dimj, iunit
+    Real (KIND=kd_dble), dimension(dimmaxi,dimj), intent(in) :: mat
+    Integer (KIND=kd_int) :: i,j,npas, kpas
+    ! -------- Code ---------------------------------------------
+    npas = dimj/10
+    if (npas.eq.0) goto 10
+    do kpas = 1,npas
+       do i = 1, dimi
+          write(iunit,9993)   (mat(i,j), j=(kpas-1)*10+1,kpas*10)
+       end do
+       write(iunit,*)
+    end do
+    
+10  if (mod(dimj,10).eq.0) return 
+    do i = 1, dimi
+       write(iunit,9993)   (mat(i,j), j=npas*10+1,dimj)
+    end do
+    
+9993 format (5x,10(E15.6,1x))        
+  end Subroutine wrtmatE
+!!$============================================================
+End Module utils_wrt
+!!$ Local Variables:
+!!$   coding: utf-8-unix
+!!$ End:
diff --git a/src/vec_storage.F90 b/src/vec_storage.F90
new file mode 100644
index 0000000000000000000000000000000000000000..3805ba4fd8c0fd80d504d2d90f04415d95c1714a
--- /dev/null
+++ b/src/vec_storage.F90
@@ -0,0 +1,951 @@
+!!-------------------------------------------------------
+!!---- Relaxed Selected Excitation (RelaxSE)
+!!-------------------------------------------------------
+!!---- This file is part of RelaxSE
+!!---- 
+!!---- The RelaxSE project is distributed under LGPL. In agreement with the
+!!---- Intergovernmental Convention of the ILL, this software cannot be used
+!!---- in military applications.
+!!---- 
+!!---- Copyright (C) 2016-2021  Institut Laue-Langevin (ILL), Grenoble, FRANCE
+!!----                          Institut Neel - CNRS-UPR2940 (CNRS), Grenoble, FRANCE
+!!---- 
+!!---- Authors: Elisa REBOLINI (ILL)             rebolini@ill.fr
+!!----          Marie-Bernadette LEPETIT (CNRS)  Marie-Bernadette.Lepetit@neel.cnrs.fr
+!!---- 
+!!---- RelaxSE is free software; you can redistribute it and/or
+!!---- modify it under the terms of the GNU Lesser General Public
+!!---- License as published by the Free Software Foundation; either
+!!---- version 3.0 of the License, or (at your option) any later version.
+!!---- 
+!!---- RelaxSE is distributed in the hope that it will be useful,
+!!---- but WITHOUT ANY WARRANTY; without even the implied warranty of
+!!---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+!!---- Lesser General Public License for more details.
+!!---- 
+!!---- You should have received a copy of the GNU Lesser General Public
+!!---- License along with this library; if not, see <http://www.gnu.org/licenses/>.
+!!---- 
+
+module vec_storage
+
+  use dimensions
+
+  implicit none
+  private
+
+  public :: &
+       vec_init, &
+       vec_free, &
+       vec_print, &
+       vec_zero, &
+       vec_get, &
+       vec_from_full
+
+  interface vec_init
+     module procedure rvec_init, rvecarrayp_init, vec_init_rvecarrayp, &
+          ivecvec_init, ivec_init, vec_init_ivecp, &
+          cvecvec_init, cvec_init, vec_init_cvecp, connect_init
+  end interface vec_init
+
+  interface vec_free
+     module procedure rvec_free, rvecarrayp_free, vec_free_rvecarrayp, &
+          ivecvec_free, ivec_free, vec_free_ivecp, &
+          cvecvec_free
+  end interface vec_free
+
+  interface vec_print
+     module procedure rvec_print, ivec_print, ivecvec_print
+  end interface vec_print
+
+  interface vec_zero
+     module procedure rvec_zero, ivec_zero
+  end interface vec_zero
+
+  interface vec_get
+     module procedure ivec_get, cvec_get
+  end interface vec_get
+
+  interface vec_from_full
+     module procedure ivec_from_full
+  end interface vec_from_full
+
+  !===================================================================
+  !> @brief Storage type for connect vector arrays
+  !===================================================================
+  type, public :: connect
+     SEQUENCE
+     integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+     integer               :: sign_act, Ndiffact_I, Ndiffact_J, nandIJ
+     integer, allocatable  :: andIJ(:), spinandIJ(:)
+  end type connect
+
+  type, public :: connectp
+     type(connect), pointer :: p
+  end type connectp
+
+  type, public :: connectvec
+     type(connectp), pointer :: elms(:)
+     integer :: nrow
+  end type connectvec
+
+  type :: connectvecp
+     type(connectvec), pointer :: p
+  end type connectvecp
+  
+  type, public :: connectvecvec
+     type(connectvecp), pointer :: vl(:)
+     !> @brief alloc If alloc(i) then vl(i)%p is initialized
+     logical, pointer :: alloc(:)
+     !> @brief nvec Number of vectors in vl
+     integer :: nvec
+     !> @brief
+     logical :: init
+  end type connectvecvec
+
+  
+  !===================================================================
+  !> @brief Storage type for integer vector arrays
+  !===================================================================
+  type, public :: intvecvec
+     !> @brief vl veclist Array of vector pointers
+     type(intvecp), pointer :: vl(:)
+     !> @brief alloc If alloc(i) then vl(i)%p is initialized
+     logical, pointer :: alloc(:)
+     !> @brief nvec Number of vectors in vl
+     integer :: nvec
+     !> @brief
+     logical :: init
+  end type intvecvec
+
+  type :: intvecp
+     type(intvec), pointer :: p
+  end type intvecp
+  
+  type, public :: intvec
+     integer, pointer :: elms(:)
+     integer :: nrow
+  end type intvec
+  
+  !===================================================================  
+  !> @brief Storage type for real vector arrays
+  !===================================================================
+  type, public :: rvectorarrayp
+     !> @brief vl veclist Array of vector pointers
+     type(rvectorp), pointer :: vl(:)
+     !> @brief alloc If alloc(i) then vl(i)%p is initialized
+     logical, pointer :: alloc(:)
+     !> @brief nvec Number of vectors in vl
+     integer :: nvec
+     !> @brief nrow Number of row in each vector
+     integer :: nrow
+  end type rvectorarrayp
+
+  type :: rvectorp
+     type(rvector), pointer :: p
+  end type rvectorp
+
+  type, public :: rvector
+     integer :: nrow
+     real(realk), pointer :: elms(:)
+  end type rvector
+
+contains
+  !*******************************************************************
+  ! Subroutines for the connect vector type
+  !*******************************************************************
+  !> @brief Initialization of an intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vector to be initialized
+  !> @param nvec Number of integer vectors
+  !===================================================================
+  subroutine cvecvec_init(vec, nvec)
+
+    implicit none
+
+    type(connectvecvec), intent(inout) :: vec
+    integer, intent(in)               :: nvec
+
+    integer :: i
+    
+    if (nvec .lt. 0) then
+       stop 'Vector length must be greather than 0'
+    else if (nvec .eq. 0) then
+       vec%init = .false.
+    else
+       vec%init = .true.
+       vec%nvec = nvec
+       allocate(vec%vl(vec%nvec))
+       do i=1,nvec
+          nullify(vec%vl(i)%p)
+          allocate(vec%vl(i)%p)
+       enddo
+       allocate(vec%alloc(vec%nvec))
+       vec%alloc(:) = .false.
+    endif
+       
+  end subroutine cvecvec_init
+
+  !===================================================================
+  !> @brief Free an intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors to be freed
+  !===================================================================
+  subroutine cvecvec_free(vec)
+
+    implicit none
+    
+    type(connectvecvec), intent(inout) :: vec
+
+    integer :: i
+
+    if (vec%init) then
+       do i = 1, vec%nvec
+          if (vec%alloc(i)) then
+             call vec_free_cvecp(vec,i)
+          !   deallocate(vec%vl(i)%p)
+          endif
+          deallocate(vec%vl(i)%p)
+       enddo
+       deallocate(vec%vl)
+       deallocate(vec%alloc)
+    endif
+  end subroutine cvecvec_free
+
+!!$  !===================================================================
+!!$  !> @brief Print an intvecvec object
+!!$  !> @author Elisa Rebolini
+!!$  !> @date Oct 2017
+!!$  !
+!!$  !> @param[in] vec Vector of integer vectors to be printed
+!!$  !> @param[in] iout Printing unit
+!!$  !===================================================================
+!!$  subroutine cvecvec_print(vec, iout)
+!!$
+!!$    implicit none
+!!$
+!!$    type(conectvecvec), intent(in) :: vec
+!!$    integer, intent(in) :: iout
+!!$
+!!$    integer :: i
+!!$
+!!$    do i=1,vec%nvec
+!!$       if (vec%alloc(i)) then
+!!$          call cvec_print(vec%vl(i)%p,iout)
+!!$       else      
+!!$          write(iout,*) 'Empty'
+!!$       endif
+!!$    enddo
+!!$    
+!!$  end subroutine cvecvec_print
+
+  !===================================================================
+  !> @brief Initialization of an ivecp object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be initialized
+  !> @param nrow Number of rows
+  !===================================================================
+  subroutine cvecp_init(vec)
+
+    implicit none
+
+    type(connectvecp), intent(inout) :: vec
+!    integer, intent(in) :: nrow
+
+    nullify(vec%p)
+    allocate(vec%p)
+!    call ivec_init(vec%p, nrow)
+    
+  end subroutine cvecp_init
+
+  
+  !===================================================================
+  !> @brief Initialization of an intvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be initialized
+  !> @param nrow Number of rows
+  !===================================================================
+  subroutine cvec_init(vec, nrow)
+
+    implicit none
+
+    type(connectvec), intent(inout) :: vec
+    integer, intent(in) :: nrow
+
+    integer :: i
+    
+    nullify(vec%elms)
+    vec%nrow = nrow
+    allocate(vec%elms(vec%nrow))
+    do i=1,nrow
+       nullify(vec%elms(i)%p)
+       allocate(vec%elms(i)%p)
+    enddo
+        
+  end subroutine cvec_init
+
+  !===================================================================
+  !> @brief Initialization of a connect object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param c Vector of integers to be initialized
+  !> @param nandIJ Number of rows
+  !===================================================================
+  subroutine connect_init(c, nandIJ)
+
+    implicit none
+
+    type(connect), intent(inout) :: c
+    integer, intent(in) :: nandIJ
+
+    c%nandIJ = nandIJ
+    allocate(c%andIJ(nandIJ))
+    allocate(c%spinandIJ(nandIJ))
+    
+  end subroutine connect_init
+
+  !===================================================================
+  !> @brief Free a connect object
+  !> @author Elisa Rebolini
+  !> @date Oct 2020
+  !
+  !> @param c Connect object to be freed 
+  !===================================================================
+  subroutine connect_free(c)
+
+    implicit none
+
+    type(connect), intent(inout) :: c
+
+    deallocate(c%andIJ)
+    deallocate(c%spinandIJ)
+    
+  end subroutine connect_free  
+
+  !===================================================================
+  !> @brief Free a connectvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2020
+  !
+  !> @param vec Vector of connect to be freed
+  !===================================================================
+  subroutine cvec_free(vec)
+
+    implicit none
+    
+    type(connectvec), intent(inout) :: vec
+
+    integer :: i
+    
+    if (.not.associated(vec%elms)) then
+       stop 'Memory previously released'
+    endif
+    do i = 1, vec%nrow
+       call connect_free(vec%elms(i)%p)
+       deallocate(vec%elms(i)%p)
+    enddo
+    deallocate(vec%elms)
+        
+  end subroutine cvec_free
+
+
+  !===================================================================
+  !> @brief Initialization of vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be initialized
+  !> @param nrow Number of rows of the integer vector
+  !===================================================================
+  subroutine vec_init_cvecp(vec, indx, nrow)
+
+    implicit none
+
+    type(connectvecvec), intent(inout) :: vec
+    integer, intent(in) :: indx, nrow
+
+    if ((indx .gt. vec%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_init_cvecp'
+    endif
+
+    if (.not.vec%alloc(indx)) then
+       call cvec_init(vec%vl(indx)%p, nrow)
+       vec%alloc(indx) = .true. 
+    else
+       stop 'Vector already allocated'
+    endif
+    
+  end subroutine vec_init_cvecp
+
+
+  !===================================================================
+  !> @brief Free vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be freed
+  !===================================================================
+  subroutine vec_free_cvecp(vec, indx)
+
+    implicit none
+
+    type(connectvecvec), intent(inout) :: vec
+    integer, intent(in) :: indx
+
+    if ((indx .gt. vec%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_init_cvecp'
+    endif
+    
+    if (vec%alloc(indx)) then
+       call cvec_free(vec%vl(indx)%p)
+       vec%alloc(indx) = .false.
+    else
+       stop "Trying to deallocate vector before it's been allocated"
+    endif
+        
+  end subroutine vec_free_cvecp
+
+  !===================================================================
+  !> @brief Return a pointer to the vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be returned
+  !> @return p Pointer
+  !===================================================================
+  function cvec_get(vec, indx) result(p)
+
+    implicit none
+    
+    type(connectvecvec), intent(in) :: vec
+    integer, intent(in) :: indx
+
+    type(connectvec), pointer :: p
+
+    if (.not.vec%alloc(indx)) then
+       nullify(p)
+    else
+       p => vec%vl(indx)%p
+    endif
+    
+  end function cvec_get
+
+
+
+
+
+
+  
+  !*******************************************************************
+  ! Subroutines for the int vector type
+  !*******************************************************************
+  !> @brief Initialization of an intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vector to be initialized
+  !> @param nvec Number of integer vectors
+  !===================================================================
+  subroutine ivecvec_init(vec, nvec)
+
+    implicit none
+
+    type(intvecvec), intent(inout) :: vec
+    integer, intent(in)          :: nvec
+
+    integer :: i
+    
+    if (nvec .lt. 0) then
+       stop 'Vector length must be greather than 0'
+    else if (nvec .eq. 0) then
+       vec%init = .false.
+    else
+       vec%init = .true.
+       vec%nvec = nvec
+       allocate(vec%vl(vec%nvec))
+       do i=1,nvec
+          !call ivecp_init(vec%vl(i))
+          nullify(vec%vl(i)%p)
+          allocate(vec%vl(i)%p)
+       enddo
+       allocate(vec%alloc(vec%nvec))
+       vec%alloc(:) = .false.
+    endif
+       
+  end subroutine ivecvec_init
+
+  !===================================================================
+  !> @brief Free an intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors to be freed
+  !===================================================================
+  subroutine ivecvec_free(vec)
+
+    implicit none
+    
+    type(intvecvec), intent(inout) :: vec
+
+    integer :: i
+
+    if (vec%init) then
+       do i = 1, vec%nvec
+          if (vec%alloc(i)) then
+             call vec_free_ivecp(vec,i)
+          !   deallocate(vec%vl(i)%p)
+          endif
+          deallocate(vec%vl(i)%p)
+       enddo
+       deallocate(vec%vl)
+       deallocate(vec%alloc)
+    endif
+  end subroutine ivecvec_free
+
+  !===================================================================
+  !> @brief Print an intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] vec Vector of integer vectors to be printed
+  !> @param[in] iout Printing unit
+  !===================================================================
+  subroutine ivecvec_print(vec, iout)
+
+    implicit none
+
+    type(intvecvec), intent(in) :: vec
+    integer, intent(in) :: iout
+
+    integer :: i
+
+    do i=1,vec%nvec
+       if (vec%alloc(i)) then
+          call ivec_print(vec%vl(i)%p,iout)
+       else      
+          write(iout,*) 'Empty'
+       endif
+    enddo
+    
+  end subroutine ivecvec_print
+
+  !===================================================================
+  !> @brief Initialization of an ivecp object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be initialized
+  !> @param nrow Number of rows
+  !===================================================================
+  subroutine ivecp_init(vec)
+
+    implicit none
+
+    type(intvecp), intent(inout) :: vec
+!    integer, intent(in) :: nrow
+
+    nullify(vec%p)
+    allocate(vec%p)
+!    call ivec_init(vec%p, nrow)
+    
+  end subroutine ivecp_init
+
+  
+  !===================================================================
+  !> @brief Initialization of an intvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be initialized
+  !> @param nrow Number of rows
+  !===================================================================
+  subroutine ivec_init(vec, nrow)
+
+    implicit none
+
+    type(intvec), intent(inout) :: vec
+    integer, intent(in) :: nrow
+    
+    nullify(vec%elms)
+    vec%nrow = nrow
+    allocate(vec%elms(vec%nrow))
+        
+  end subroutine ivec_init
+
+  !===================================================================
+  !> @brief Free an intvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be freed
+  !===================================================================
+  subroutine ivec_free(vec)
+
+    implicit none
+    
+    type(intvec), intent(inout) :: vec
+    
+    if (.not.associated(vec%elms)) then
+       stop 'Memory previously released'
+    endif
+    deallocate(vec%elms)
+        
+  end subroutine ivec_free
+
+  !===================================================================
+  !> @brief Zero an intvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integers to be zeroed
+  !===================================================================
+  subroutine ivec_zero(vec)
+
+    implicit none
+    
+    type(intvec), intent(inout) :: vec
+    
+    vec%elms(:) = 0
+        
+  end subroutine ivec_zero
+
+  !===================================================================
+  !> @brief Print an intvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] vec Vector of integers to be printed
+  !> @param[in] iout Printing unit
+  !===================================================================
+  subroutine ivec_print(vec, iout)
+
+    implicit none
+    
+    type(intvec), intent(in) :: vec
+    integer, intent(in)    :: iout
+
+    write(iout,*) vec%elms(:)
+        
+  end subroutine ivec_print
+
+  !===================================================================
+  !> @brief Fill an intvec from an array of integers
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[inout] vec Vector of integers 
+  !> @param[in] full Array of integer
+  !> @param[in] Size of the array
+  !===================================================================
+  subroutine ivec_from_full(vec, full, dim)
+
+    implicit none
+
+    type(intvec), intent(inout) :: vec
+    integer, pointer, intent(in) :: full(:)
+    integer, intent(in) :: dim
+
+    if (dim .ne. vec%nrow) then
+       stop 'Wrong size in ivec_from_full'
+    else
+       vec%elms(:) = full(:)
+    endif
+    
+  end subroutine ivec_from_full
+  
+  !===================================================================
+  !> @brief Print an intvecp object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param[in] vec Pointer to a vector of integers to be printed
+  !> @param[in] iout Printing unit
+  !===================================================================
+  subroutine ivecp_print(vec, iout)
+
+    implicit none
+    
+    type(intvecp), intent(in) :: vec
+    integer, intent(in)    :: iout
+
+    if (associated(vec%p)) then 
+       write(iout,*) vec%p%elms(:)
+    endif
+  end subroutine ivecp_print
+
+  !===================================================================
+  !> @brief Initialization of vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be initialized
+  !> @param nrow Number of rows of the integer vector
+  !===================================================================
+  subroutine vec_init_ivecp(vec, indx, nrow)
+
+    implicit none
+
+    type(intvecvec), intent(inout) :: vec
+    integer, intent(in) :: indx, nrow
+
+    if ((indx .gt. vec%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_init_ivecp'
+    endif
+
+    if (.not.vec%alloc(indx)) then
+       call ivec_init(vec%vl(indx)%p, nrow)
+       vec%alloc(indx) = .true. 
+    else
+       stop 'Vector already allocated'
+    endif
+    
+  end subroutine vec_init_ivecp
+
+
+  !===================================================================
+  !> @brief Free vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be freed
+  !===================================================================
+  subroutine vec_free_ivecp(vec, indx)
+
+    implicit none
+
+    type(intvecvec), intent(inout) :: vec
+    integer, intent(in) :: indx
+
+    if ((indx .gt. vec%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_init_ivecp'
+    endif
+    
+    if (vec%alloc(indx)) then
+       call ivec_free(vec%vl(indx)%p)
+       vec%alloc(indx) = .false.
+    else
+       stop "Trying to deallocate vector before it's been allocated"
+    endif
+        
+  end subroutine vec_free_ivecp
+
+  !===================================================================
+  !> @brief Return a pointer to the vector of index indx in intvecvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of integer vectors
+  !> @param indx Index of the integer vector to be returned
+  !> @return p Pointer
+  !===================================================================
+  function ivec_get(vec, indx) result(p)
+
+    implicit none
+    
+    type(intvecvec), intent(in) :: vec
+    integer, intent(in) :: indx
+
+    type(intvec), pointer :: p
+
+    if (.not.vec%alloc(indx)) then
+       nullify(p)
+    else
+       p => vec%vl(indx)%p
+    endif
+    
+  end function ivec_get
+
+
+
+
+  
+  !*******************************************************************
+  ! Subroutines for the real vector type
+  !*******************************************************************
+  !===================================================================
+  !> @brief Initialization of an rvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of reals to be initialized
+  !> @param nrow Number of rows
+  !===================================================================
+  subroutine rvec_init(vec, nrow)
+
+    implicit none
+    
+    type(rvector), intent(inout) :: vec
+    integer, intent(in)         :: nrow
+    
+    nullify(vec%elms)
+    vec%nrow = nrow
+    allocate(vec%elms(vec%nrow))
+    
+  end subroutine rvec_init
+
+  !===================================================================
+  !> @brief Free an rvec object
+  !> @author Elisa Rebolini
+  !> @date Oct 2017
+  !
+  !> @param vec Vector of reals to be initialized
+  !===================================================================
+  subroutine rvec_free(vec)
+
+    implicit none
+    
+    type(rvector) :: vec
+    
+    if (.not.associated(vec%elms)) then
+       stop 'Memory previously released'
+    endif
+    deallocate(vec%elms)
+    nullify(vec%elms)
+    
+  end subroutine rvec_free
+
+  subroutine rvec_print(vec,iout)
+    !> @brief Print vector to iout
+    type(rvector), intent(in) :: vec
+    integer, intent(in) :: iout
+
+    integer :: i
+
+    do i=1,vec%nrow
+       write(iout,'(d12.6)') vec%elms(i)
+    enddo
+  end subroutine rvec_print
+
+  subroutine rvec_zero(vec)
+    !> @brief Set a vecor to zero
+    type(rvector) :: vec
+
+    vec%elms(:) = 0.0_realk
+    
+  end subroutine rvec_zero
+
+  !*******************************************************************
+  ! Subroutines for the vectorarrayp type
+  !*******************************************************************
+  subroutine rvecarrayp_init(vatype, nvec, nrow)
+    !> @brief Initialise an array of nvec vectors of size nrow
+    !> the vectors are not allocated
+    !> @param vatype[inout] rvectorarrayp to be initialized
+    !> @param nvec[in] Number of vectors
+    !> @param nrow[in] Length of the vectors
+    
+    implicit none
+    
+    type(rvectorarrayp), intent(inout) :: vatype
+    integer, intent(in) :: nvec
+    integer, intent(in) :: nrow
+
+    integer :: i
+
+    vatype%nvec = nvec
+    vatype%nrow = nrow
+    allocate(vatype%vl(vatype%nvec))
+    do i=1,nvec
+       nullify(vatype%vl(i)%p)
+    enddo
+    allocate(vatype%alloc(vatype%nvec))
+    vatype%alloc(:) = .false.
+
+  end subroutine rvecarrayp_init
+
+  subroutine rvecarrayp_free(vatype)
+    !> @brief Free a vecarrayp object
+
+    implicit none
+    
+    type(rvectorarrayp), intent(inout) :: vatype
+
+    integer :: i
+    
+    do i = 1, vatype%nvec
+       if (vatype%alloc(i)) then
+          call vec_free_rvecarrayp(vatype,i)
+       endif
+    enddo
+    deallocate(vatype%alloc)
+    
+  end subroutine rvecarrayp_free
+
+  subroutine rvecarrayp_print(vatype, iout)
+    !> @brief Print an array of vector to iout
+    implicit none
+
+    type(rvectorarrayp), intent(in) :: vatype
+    integer, intent(in) :: iout
+
+    integer :: i
+    type(rvector), pointer :: vec_tmp
+
+    do i = 1, vatype%nvec
+       if (vatype%alloc(i)) then
+          write(iout,'(A,I0)') '\n',i
+          vec_tmp => vatype%vl(i)%p
+          call rvec_print(vec_tmp,iout)
+       endif
+    enddo
+    
+  end subroutine rvecarrayp_print
+  
+  subroutine vec_init_rvecarrayp(vatype, indx)
+    !> brief Initialise vector of index indx in vector array vatype
+
+    implicit none
+    
+    type(rvectorarrayp), intent(inout) :: vatype
+    integer, intent(in)               :: indx
+
+    type(rvector), pointer :: vec_tmp
+    
+    if ((indx .gt. vatype%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_init_vecarrayp'
+    endif
+    if (.not.vatype%alloc(indx)) then
+       write(*,*) 'Init vec at position', indx
+       allocate(vatype%vl(indx)%p)
+       call rvec_init(vatype%vl(indx)%p, vatype%nrow)
+       write(*,*) 'Done'
+       vatype%alloc(indx) = .true.
+    else
+       stop 'Vector already allocated'
+    endif
+  end subroutine vec_init_rvecarrayp
+
+  subroutine vec_free_rvecarrayp(vatype, indx)
+    !> brief Free vector of index indx in vector array vatype
+
+    implicit none
+    
+    type(rvectorarrayp), intent(inout) :: vatype
+    integer, intent(in)               :: indx
+
+    if ((indx .gt. vatype%nvec) .or. (indx .le. 0)) then
+       stop 'Wrong index in vec_free_vecarrayp'
+    endif
+    if (vatype%alloc(indx)) then
+       deallocate(vatype%vl(indx)%p%elms)
+       nullify(vatype%vl(indx)%p)
+       vatype%alloc(indx) = .false.
+    else
+       stop "Trying to deallocate vector before it's been allocated"
+    endif
+  end subroutine vec_free_rvecarrayp
+end module vec_storage
diff --git a/test/CuO_00800_HS/INPUT b/test/CuO_00800_HS/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..e18abc1de87b398b9c2bc9b30d8caeb64f13e1ca
--- /dev/null
+++ b/test/CuO_00800_HS/INPUT
@@ -0,0 +1,42 @@
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.,
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 0, 
+   norb_ligo = 0, 
+   norb_act  = 8, 
+   norb_ligv = 0, 
+   norb_virt = 0, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=9, 
+  sz=8, 
+  vec_irrep=1, 
+  nvec=1, 
+  nref0=1, 
+  nelact = 8
+ &end
+
+ &davidinp
+  NIterDavidson = 0
+  SizeheffDavidson = 5,
+  tol_conv = 1.d-16,
+ &end
+
diff --git a/test/CuO_00800_HS/cuo.TraInt b/test/CuO_00800_HS/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_00800_HS/cuo.TraInt differ
diff --git a/test/CuO_00800_HS/cuo.TraOne b/test/CuO_00800_HS/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_00800_HS/cuo.TraOne differ
diff --git a/test/CuO_00800_HS/cuo.ref0 b/test/CuO_00800_HS/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..9f0595231b9ce2604c2e348cf28ae5ae1d384bde
--- /dev/null
+++ b/test/CuO_00800_HS/cuo.ref0
@@ -0,0 +1,3 @@
+41u 42u 43u 44u 45u 46u 47u 48u
+
+
diff --git a/test/CuO_00800_HS/result/cuo.out b/test/CuO_00800_HS/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..d6d7221283405b3dc659250ed10f1d24b42e65b4
--- /dev/null
+++ b/test/CuO_00800_HS/result/cuo.out
@@ -0,0 +1,433 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ DEBUG VersionT
+ Calculation started on 03-12-2020 at 14:52
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   8
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     0     0     8     0     0    70     8   118
+
+  Nbre de vecteurs                 :   1
+  2S+1, 2Sz                        :   9     8
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   8
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :   1
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            0
+    Ligo   =            0
+    Act    =            8
+       Molcas    :      41     42     43     44     45     46     47     48
+       Molcas/ir :      41     42     43     44     45     46     47     48
+       SelS      :      41     42     43     44     45     46     47     48
+       SelS up   :      81     82     83     84     85     86     87     88
+       SelS dn   :      89     90     91     92     93     94     95     96
+    Ligv   =            0
+    Virt   =            0
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    11111111 00000000 
+
+ >>> Generation of all determinants
+  Ref0:     1  Couches fermees :   0 - 00000000 00000000  Ref0:     1  Couches ouvertes:   8 - 11111111 00000000
+
+  Nbre de conf d'espace unique :  1
+  Ref0 irr:     1  Couches fermees :   0 - 00000000  Ref0 irr:     1  Couches ouvertes:   8 - 11111111
+  Nbre de det Ref0 final :  1
+  Ref0 finaux 
+    1   :   11111111 00000000
+  Nbre de det Ref1 (debug) :       0
+  Nbre de det Ref1 CAS -> CAS :       0
+  Nbre de det Ref1 ligo-> CAS :       0
+  Nbre de det Ref1 CAS -> ligv:       0
+  Nbre de det Ref1 ligo-> ligv tot:       0
+  Ref1 Cas  -> Cas  :    1 ->     0
+===
+Active determinant list R_-2
+Contains 28 determinants
+           0           2          -2
+           0           0          28
+===
+Active determinant list R_-1
+Contains 232 determinants
+           1          -1           3          -3
+           0           8           0         224
+===
+Active determinant list R_0
+Contains 849 determinants
+           0           2          -2           4          -4
+           1           0          64           0         784
+===
+Active determinant list R_1
+Contains 232 determinants
+           1          -1           3          -3
+           0           8           0         224
+===
+Active determinant list R_2
+Contains 28 determinants
+           0           2          -2
+           0           0          28
+  >>> Generation of D0
+ Estimated nb of det. 849
+  Nb of determinants in D  0 =                                        1
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+ Estimated nb of det. 0
+  Nb of determinants in D  1 =                                        0
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+ Estimated nb of det. 0
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+ Estimated nb of det. 0
+  Nb of determinants in D 11 =                                        0
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+ Estimated nb of det. 0
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+ Estimated nb of det. 0
+  Nb of determinants in D-11 =                                        0
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+ Estimated nb of det. 0
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+ Estimated nb of det. 0
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+ Estimated nb of det. 0
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                             1
+ >>>Determinants generated in  0.44233099999999997      second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  BSLbl = 
+    Irrep =  1
+         1  CU01  1s  
+         2  CU01  2px 
+         3  CU01  2px 
+         4  CU01  2py 
+         5  CU01  2py 
+         6  CU01  2pz 
+         7  CU01  2pz 
+         8  CU01  3d2-
+         9  CU01  3d2-
+        10  CU01  3d1-
+        11  CU01  3d1-
+        12  CU01  3d0 
+        13  CU01  3d0 
+        14  CU01  3d1+
+        15  CU01  3d1+
+        16  CU01  3d2+
+        17  CU01  3d2+
+        18  CU02  1s  
+        19  CU02  2px 
+        20  CU02  2px 
+        21  CU02  2py 
+        22  CU02  2py 
+        23  CU02  2pz 
+        24  CU02  2pz 
+        25  CU02  3d2-
+        26  CU02  3d2-
+        27  CU02  3d1-
+        28  CU02  3d1-
+        29  CU02  3d0 
+        30  CU02  3d0 
+        31  CU02  3d1+
+        32  CU02  3d1+
+        33  CU02  3d2+
+        34  CU02  3d2+
+        35  O_03  1s  
+        36  O_03  2px 
+        37  O_03  2px 
+        38  O_03  2py 
+        39  O_03  2py 
+        40  O_03  2pz 
+        41  O_03  2pz 
+        42  O_03  3d2-
+        43  O_03  3d1-
+        44  O_03  3d0 
+        45  O_03  3d1+
+        46  O_03  3d2+
+        47  O_04  1s  
+        48  O_04  2px 
+        49  O_04  2px 
+        50  O_04  2py 
+        51  O_04  2py 
+        52  O_04  2pz 
+        53  O_04  2pz 
+        54  O_04  3d2-
+        55  O_04  3d1-
+        56  O_04  3d0 
+        57  O_04  3d1+
+        58  O_04  3d2+
+        59  O_05  1s  
+        60  O_05  2px 
+        61  O_05  2px 
+        62  O_05  2py 
+        63  O_05  2py 
+        64  O_05  2pz 
+        65  O_05  2pz 
+        66  O_05  3d2-
+        67  O_05  3d1-
+        68  O_05  3d0 
+        69  O_05  3d1+
+        70  O_05  3d2+
+        71  O_06  1s  
+        72  O_06  2px 
+        73  O_06  2px 
+        74  O_06  2py 
+        75  O_06  2py 
+        76  O_06  2pz 
+        77  O_06  2pz 
+        78  O_06  3d2-
+        79  O_06  3d1-
+        80  O_06  3d0 
+        81  O_06  3d1+
+        82  O_06  3d2+
+        83  O_07  1s  
+        84  O_07  2px 
+        85  O_07  2px 
+        86  O_07  2py 
+        87  O_07  2py 
+        88  O_07  2pz 
+        89  O_07  2pz 
+        90  O_07  3d2-
+        91  O_07  3d1-
+        92  O_07  3d0 
+        93  O_07  3d1+
+        94  O_07  3d2+
+        95  O_08  1s  
+        96  O_08  2px 
+        97  O_08  2px 
+        98  O_08  2py 
+        99  O_08  2py 
+       100  O_08  2pz 
+       101  O_08  2pz 
+       102  O_08  3d2-
+       103  O_08  3d1-
+       104  O_08  3d0 
+       105  O_08  3d1+
+       106  O_08  3d2+
+       107  O_09  1s  
+       108  O_09  2px 
+       109  O_09  2px 
+       110  O_09  2py 
+       111  O_09  2py 
+       112  O_09  2pz 
+       113  O_09  2pz 
+       114  O_09  3d2-
+       115  O_09  3d1-
+       116  O_09  3d0 
+       117  O_09  3d1+
+       118  O_09  3d2+
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                0
+  (ao|oo)                                0
+  (aa|oo) and (ao|ao)                    0
+  (aa|ao)                                0
+  (aa|aa)                              666
+  (vo|oo)                                0
+  (va|oo) and (vo|ao)                    0
+  (va|ao) and (vo|aa)                    0
+  (va|aa)                                0
+  (vv|oo) and (vo|vo)                    0
+  (vv|ao), and (va|vo)                   0
+  (vv|aa) and (va|va)                    0
+  (vv|vo)                                0
+  (vv|va)                                0
+  (vv|vv)                                0
+  gelees                                 0
+ >>> Integrals read in   1.7780000000000018E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   3.1199999999997896E-004 second(s)
+
+  One-electron energy =    0.0000000000000000     
+  Two-electron energy =    0.0000000000000000     
+  E0                  =    0.0000000000000000     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -457.08617410062368     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix
+ >>> Hdiag built in CPU time:    0.000343 second(s)  Wall time:    0.000000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+
+ Eigenvalues of the D00-D00 Matrix
+  1  -460.9152994242606951
+ >>> H0 diagonalised in   1.9399999999997197E-004 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 1 vectors with a convergence threshold of  1.0E-08
+
+Total Elapsed tWall       0.4540s
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -460.9152994243
+      1       0.0015       0.0020   -460.9152994243
+    
+ >>> No convergence after             1  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.000000E+00
+
+ Energies :   -460.915299424260695
+ E ss ref :     -3.829125323637035
+ dE (a.u.):      0.000000000000000
+ dE (meV) :      0.000000000000000
+ |Hv-Ev|  :             0.0000E+00
+ deltaE   :             0.0000E+00
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+  verif 3
+   1.0000000000000000     
+   2.3203533577664253E+077
+  Hv a la main
+ Vp Hmat, |Hv-Ev|, <v|H|v>-E           1  -3.8291253236370353        0.0000000000000000        0.0000000000000000     
+
+  Hv avec compute_HVm
+ Vp Hmat, |Hv-Ev|, <v|H|v>-E           1  -3.8291253236370353        0.0000000000000000        0.0000000000000000     
+ Calculation finished in CPUtime             0.62s Walltime:             0.62s
+ Calculation finished on 03-12-2020 at 14:52
diff --git a/test/CuO_00800_HS/test b/test/CuO_00800_HS/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_00800_HS/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_00800_LS/INPUT b/test/CuO_00800_LS/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..beda4eccf4bad05e48f67a5ea5c829dfd867b14f
--- /dev/null
+++ b/test/CuO_00800_LS/INPUT
@@ -0,0 +1,41 @@
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.,
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 0, 
+   norb_ligo = 0, 
+   norb_act  = 8, 
+   norb_ligv = 0, 
+   norb_virt = 0, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=7, 
+  sz=6, 
+  vec_irrep=1, 
+  nvec=9, 
+  nref0=1, 
+  nelact = 8
+ &end
+
+ &davidinp
+  NiterDavidson = 2,
+  tol_conv = 1.d-16,
+ &end
+
diff --git a/test/CuO_00800_LS/cuo.TraInt b/test/CuO_00800_LS/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_00800_LS/cuo.TraInt differ
diff --git a/test/CuO_00800_LS/cuo.TraOne b/test/CuO_00800_LS/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_00800_LS/cuo.TraOne differ
diff --git a/test/CuO_00800_LS/cuo.ref0 b/test/CuO_00800_LS/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..c6dd995e365dec63a1036cbbe6415ec10648b4dc
--- /dev/null
+++ b/test/CuO_00800_LS/cuo.ref0
@@ -0,0 +1,3 @@
+41u 42u 43u 44u 45u 46u 47u 48d
+
+
diff --git a/test/CuO_00800_LS/result/cuo.out b/test/CuO_00800_LS/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..ada444cace37324bc063a08ed09fc16c25e82f05
--- /dev/null
+++ b/test/CuO_00800_LS/result/cuo.out
@@ -0,0 +1,804 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ MPI version - running on 1 CPUs
+ OMP version - running on 8 threads
+ Calculation started on 11-12-2020 at 12:20
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+ bmat :                                                                        cuo.bmat
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   8
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     0     0     8     0     0    70     8   118
+
+  Nbre de vecteurs                 :   9
+  2S+1, 2Sz                        :   7     6
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   8
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       :   2
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            0
+    Ligo   =            0
+    Act    =            8
+       Molcas    :      41     42     43     44     45     46     47     48
+       Molcas/ir :      41     42     43     44     45     46     47     48
+       SelS      :      41     42     43     44     45     46     47     48
+       SelS up   :      81     82     83     84     85     86     87     88
+       SelS dn   :      89     90     91     92     93     94     95     96
+    Ligv   =            0
+    Virt   =            0
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    11111110 00000001 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  8
+  Ref1 Cas  -> Cas  :    1 ->    56
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       64
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                        0
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        0
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                        0
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                            64
+ >>>Determinants generated in   2.5028199999999998      second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                0
+  (ao|oo)                                0
+  (aa|oo) and (ao|ao)                    0
+  (aa|ao)                                0
+  (aa|aa)                              666
+  (vo|oo)                                0
+  (va|oo) and (vo|ao)                    0
+  (va|ao) and (vo|aa)                    0
+  (va|aa)                                0
+  (vv|oo) and (vo|vo)                    0
+  (vv|ao), and (va|vo)                   0
+  (vv|aa) and (va|va)                    0
+  (vv|vo)                                0
+  (vv|va)                                0
+  (vv|vv)                                0
+  gelees                                 0
+ >>> Integrals read in   1.4229999999999521E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   2.3599999999968091E-004 second(s)
+
+  One-electron energy =    0.0000000000000000     
+  Two-electron energy =    0.0000000000000000     
+  E0                  =    0.0000000000000000     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -457.08617410062368     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000389 second(s)  Wall time:    0.001000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+
+ <D00|H|D00> block of the Hamiltonian matrix
+        -3.8001981811705630     0.0079945511377858    -0.0020825132543685     0.0038527122891859    -0.0040200352543941     0.0042607939917125    -0.0033929522268926     0.0033235843121336    -0.0025707638443142    -0.0101793310315435
+         0.0079945511377858    -3.8041581135637728     0.0019175518851102    -0.0015843635972472     0.0023734703309500    -0.0029651713395952     0.0024474860447547    -0.0056846157378175    -0.0044234842620589    -0.0000326433162160
+        -0.0020825132543685     0.0019175518851102    -3.4128560556159444     0.4071467349282019    -0.0011661827330583     0.0013908341078775    -0.0017533167241978     0.0008121343882754    -0.0005975383199780     0.0054331430289153
+         0.0038527122891859    -0.0015843635972472     0.4071467349282019    -3.4109274314005109     0.0011374786198633    -0.0018305876199334     0.0017301585510884    -0.0009158566310066     0.0009332599171161    -0.0041361793621267
+        -0.0040200352543941     0.0023734703309500    -0.0011661827330583     0.0011374786198633    -3.7798568175488425     0.0127384166865502    -0.0218537280815948     0.0059791943817840     0.0007615476179712     0.0007895154580319
+         0.0042607939917125    -0.0029651713395952     0.0013908341078775    -0.0018305876199334     0.0127384166865502    -3.7697898418087288     0.0128085854087069    -0.0233410926739323     0.0003348840193678    -0.0000603631492684
+        -0.0033929522268926     0.0024474860447547    -0.0017533167241978     0.0017301585510884    -0.0218537280815948     0.0128085854087069    -3.7661665353834684     0.0189725612163326    -0.0006880143751595    -0.0000161280144041
+         0.0033235843121336    -0.0056846157378175     0.0008121343882754    -0.0009158566310066     0.0059791943817840    -0.0233410926739323     0.0189725612163326    -3.7700962842957537     0.0000605714040946     0.0002563852686107
+        -0.0025707638443142    -0.0044234842620589    -0.0005975383199780     0.0009332599171161     0.0007615476179712     0.0003348840193678    -0.0006880143751595     0.0000605714040946    -3.7122469041701667     0.0038341820113461
+        -0.0101793310315435    -0.0000326433162160     0.0054331430289153    -0.0041361793621267     0.0007895154580319    -0.0000603631492684    -0.0000161280144041     0.0002563852686107     0.0038341820113461    -3.1914784176251305
+         0.0023247963240263     0.0005684190846862    -0.0079087174351662    -0.0062832310890561    -0.0005706133098004    -0.0007797784863652     0.0001076330322435     0.0004476891020384     0.0028138702676583    -0.0425913005596964
+         0.0033623538411292     0.0008952591575631    -0.0002644390361956     0.0003309732201569    -0.0027895959210060    -0.0006567419192796     0.0000374496247091    -0.0002237219498036    -0.0054492730185915    -0.0089050186445459
+         0.0073909558024901     0.0016761249725831    -0.0002467465625129    -0.0005746176545519    -0.0009336854821957     0.0029234709762563    -0.0008415053078857     0.0013440401556083     0.0006189068547033     0.0040131497342920
+         0.0008737842135744    -0.0013419833986000    -0.0002126271949777    -0.0001397342577994    -0.0012246458163255     0.0006893817306400    -0.0013982628546419    -0.0011694157266112    -0.0023416604816399    -0.0087497932196675
+        -0.0002229921246402    -0.0018016409330470    -0.0003896760503647    -0.0003255618781696    -0.0001332231262719     0.0012136747331268     0.0010435577505586     0.0012111945273717     0.0094561600015798     0.0037597454285652
+         0.0103779570309949     0.0122306774487396     0.0005975383199780    -0.0009332599171161    -0.0007615476179712    -0.0003348840193678     0.0006880143751595    -0.0000605714040946     0.0079945511377858    -0.0004030532936573
+        -0.0004030532936573    -0.0082524580868111    -0.0031467536292765     0.0043610619802855     0.0006055373772395     0.0005945696239552    -0.0001357743591343     0.0002167825777419    -0.0000326433162160     0.0049454060129403
+        -0.0008005558085389    -0.0072381449232799     0.0004697137488920     0.0056269432465131    -0.0005389500455378     0.0003798156649126    -0.0002482671181660     0.0001133267885034     0.0005684190846862    -0.0054995840615581
+        -0.0013245086507000    -0.0023633212114619    -0.0001218490048947     0.0000491785329300    -0.0028713108792391    -0.0000052007350112     0.0011457846430694    -0.0008525404782215     0.0008952591575631     0.0007100956903435
+         0.0009550518227660     0.0168356028374976     0.0004257681764019    -0.0001994275646597     0.0003798863604430    -0.0162941982769914     0.0000757092242443     0.0014944385880088     0.0016761249725831    -0.0007670660150661
+        -0.0012400280630591    -0.0101925423504457    -0.0001116767320023     0.0000887382250933    -0.0002581642370727    -0.0004448628270349    -0.0106221066285659    -0.0016833087083127    -0.0013419833986000     0.0003911110421036
+         0.0013078145384797    -0.0205766457452679     0.0002055224097577    -0.0001349694711776    -0.0000987555603829    -0.0016093997458248    -0.0000478942975274     0.0236877020525974    -0.0018016409330470     0.0001399500838268
+         0.0030512945792377    -0.0000326433162160    -0.0077974825818659    -0.0041361793621267     0.0007895154580319    -0.0000603631492684    -0.0000161280144041     0.0002563852686107     0.0004030532936573    -0.0020825132543685
+         0.0004030532936573     0.0127138798305130     0.0076081753729784    -0.0043610619802855    -0.0006055373772395    -0.0005945696239552     0.0001357743591343    -0.0002167825777419    -0.0052991264363304    -0.0005975383199780
+        -0.0000906057841440     0.0006592015415139    -0.0919902070569251    -0.0934166405137827    -0.0001069087224813    -0.0005720012088148    -0.0008305286025775     0.0003111900149557    -0.0003333021498815    -0.0079087174351662
+         0.0002725682793906    -0.0003201229112734    -0.0058536289748745    -0.0057695230971876     0.0006755050151318     0.0006008640944249    -0.0001636547429671     0.0004195714907169    -0.0004471277445620    -0.0002644390361956
+         0.0003052743086404    -0.0003612987882628     0.0012700055376941     0.0059344797109742    -0.0006906476654997    -0.0042327129122880    -0.0004751369146538    -0.0009309727442424     0.0006105439037341    -0.0002467465625129
+        -0.0003488481070478     0.0003547569522288    -0.0058572353886240    -0.0078314089262978    -0.0002084937923348     0.0001157278223723    -0.0001287974862858     0.0008175493774043    -0.0006233604116188    -0.0002126271949777
+        -0.0002009753887385     0.0009496716475220     0.0016704243497348     0.0023751506345056     0.0003622078779933    -0.0021487474635167     0.0002840330107916     0.0009396150312703    -0.0005970231891259    -0.0003896760503647
+        -0.0192255862204958    -0.0005684190846862     0.0079087174351662    -0.0106175588074134     0.0005706133098004     0.0007797784863652    -0.0001076330322435    -0.0004476891020384    -0.0008005558085389     0.0000906057841440
+        -0.0008005558085389    -0.0023381791764293     0.0004697137488920     0.0007269774996625    -0.0005389500455378     0.0003798156649126    -0.0002482671181660     0.0001133267885034    -0.0012901982628935     0.0008916839458059
+         0.0000906057841440    -0.0006592015415139     0.0083272437615528     0.0097536772184105     0.0001069087224813     0.0005720012088148     0.0008305286025775    -0.0003111900149557     0.0008916839458059    -0.0069148068764421
+         0.0019871467742011    -0.0001841125372042     0.0006131819477916     0.0058847928649605     0.0034288859628392    -0.0002917355537812    -0.0005204896283825     0.0000997802824742    -0.0000995369362065    -0.0003620229900076
+         0.0023452262804666     0.0000156327345194     0.0094690678345650     0.0062143037631301    -0.0010801667131386     0.0047507548057081     0.0003973227981271     0.0001507588966625     0.0002174195944008     0.0000328053733865
+         0.0003936505216251    -0.0000792030523303     0.0024650798238191     0.0052867655919482    -0.0007904454971224     0.0014903138313599     0.0039452237506307    -0.0006843677720252     0.0003830732896112    -0.0000719763547908
+         0.0009815070120140    -0.0010236364829457     0.0066223442612590     0.0071987249789467    -0.0001354435527023     0.0006444871437305    -0.0012484457125895    -0.0005996136317504     0.0017100795030433    -0.0001296134057698
+         0.0023790464210389     0.0008952591575631    -0.0002644390361956     0.0003309732201569    -0.0018062885009157    -0.0006567419192796     0.0000374496247091    -0.0002237219498036     0.0013245086507000     0.0002725682793906
+         0.0013245086507000    -0.0053499748100452     0.0001218490048947    -0.0000491785329300    -0.0048419851422680     0.0000052007350112    -0.0011457846430694     0.0008525404782215    -0.0023633098428014    -0.0006589508483057
+         0.0002725682793906    -0.0003201229112734     0.0038115583003338    -0.0057695230971876    -0.0089896822600765     0.0006008640944249    -0.0001636547429671     0.0004195714907169    -0.0006589508483057    -0.0019604201603179
+        -0.0019871467742011     0.0001841125372042    -0.0006131819477916     0.0053775007112722     0.0078334076133936     0.0002917355537812     0.0005204896283825    -0.0000997802824742    -0.0002541002159793     0.0003209262303069
+        -0.0010725047406011     0.0007064562633282     0.0004319349038058    -0.0004641507217966    -0.0217634682773767    -0.0090208437886581     0.0102941873391865    -0.0033313125278589    -0.0003034978857117    -0.0001943167215190
+        -0.0009304615390300     0.0010291436753520    -0.0009811544682546     0.0008104455987589    -0.0167125668432297    -0.0026919112614725     0.0189727366233734     0.0012008757602207    -0.0001169980866690     0.0002408064668346
+        -0.0006798954439374    -0.0003407043442677    -0.0003920073716775     0.0003085226372640    -0.0018342331195999    -0.0035299123092932    -0.0120472823751378    -0.0113913242940556    -0.0009685682842788     0.0000739240356612
+        -0.0077868426920945    -0.0016761249725831     0.0002467465625129     0.0005746176545519     0.0009336854821957    -0.0033193578658606     0.0008415053078857    -0.0013440401556083     0.0009550518227660    -0.0003052743086404
+         0.0009550518227660     0.0020812363149844     0.0004257681764019    -0.0001994275646597     0.0003798863604430    -0.0015398317544783     0.0000757092242443     0.0014944385880088     0.0045577747673754     0.0005429700515907
+        -0.0003052743086404     0.0003612987882628     0.0009896126745134    -0.0059344797109742     0.0006906476654997     0.0064923311244955     0.0004751369146538     0.0009309727442424     0.0005429700515907    -0.0011769910242206
+         0.0023452262804666     0.0000156327345194     0.0094690678345650    -0.0035425357548917    -0.0010801667131386     0.0145075943237299     0.0003973227981271     0.0001507588966625     0.0006299401924475    -0.0044627624680706
+         0.0010725047406011    -0.0007064562633282    -0.0004319349038058     0.0004641507217966     0.0164670998568952     0.0037244753681766    -0.0102941873391865     0.0033313125278589    -0.0002356054892580    -0.0003480059066565
+        -0.0003063754525252     0.0007006636139039    -0.0005831194399916     0.0005621923875439     0.0056565395854700    -0.0034225819674494    -0.0002251400992271     0.0067016305597277     0.0001886644862700    -0.0003008069867104
+         0.0008439870377019     0.0023495762333201     0.0002137876544272    -0.0005117900477540    -0.0014951694569210     0.0045658900231715    -0.0114969619095509    -0.0183380328830805     0.0013328266394818    -0.0004593449937413
+         0.0032073510873842    -0.0013419833986000    -0.0002126271949777    -0.0001397342577994    -0.0012246458163255     0.0006893817306400    -0.0037318297284517    -0.0011694157266112     0.0012400280630591    -0.0003488481070478
+         0.0012400280630591    -0.0055198425202958     0.0001116767320023    -0.0000887382250933     0.0002581642370727     0.0004448628270349    -0.0050902782421755     0.0016833087083127     0.0036216244568656    -0.0004842238196106
+        -0.0003488481070478     0.0003547569522288     0.0048102743549506    -0.0078314089262978    -0.0002084937923348     0.0001157278223723    -0.0107963072298604     0.0008175493774043    -0.0004842238196106     0.0028616534640052
+        -0.0003936505216251     0.0000792030523303    -0.0024650798238191     0.0083253293811272     0.0007904454971224    -0.0014903138313599     0.0096668712224446     0.0006843677720252     0.0000431178460210    -0.0029492509788060
+        -0.0009304615390300     0.0010291436753520    -0.0009811544682546     0.0008104455987589     0.0307046028703765    -0.0026919112614725    -0.0284444330902328     0.0012008757602207    -0.0001399930368415     0.0000560643174712
+         0.0003063754525252    -0.0007006636139039     0.0005831194399916    -0.0005621923875439    -0.0056565395854700     0.0038411853882602     0.0006437435200379    -0.0067016305597277    -0.0004313717873216    -0.0004182475830022
+         0.0004477856966785     0.0011322107122810    -0.0005560462007014     0.0004062099112327     0.0010909080264402     0.0009168262041183    -0.0119825193983360    -0.0134551187035507     0.0008529848013036    -0.0001116196754281
+         0.0014018170120726     0.0018016409330470     0.0003896760503647     0.0003255618781696     0.0001332231262719    -0.0012136747331268    -0.0010435577505586    -0.0000323696399393     0.0013078145384797     0.0002009753887385
+         0.0013078145384797    -0.0041064601154127     0.0002055224097577    -0.0001349694711776    -0.0000987555603829    -0.0016093997458248    -0.0000478942975274     0.0072175164227422     0.0009837663045315     0.0002106754830618
+         0.0002009753887385    -0.0009496716475220     0.0042739462683598    -0.0023751506345056    -0.0003622078779933     0.0021487474635167    -0.0002840330107916     0.0050047555868243     0.0002106754830618     0.0013875497248185
+         0.0009815070120140    -0.0010236364829457     0.0066223442612590    -0.0054536179121804    -0.0001354435527023     0.0006444871437305    -0.0012484457125895     0.0120527292593767     0.0007571848379388    -0.0024639009000980
+         0.0006798954439374     0.0003407043442677     0.0003920073716775    -0.0003085226372640    -0.0097347277593958     0.0035299123092932     0.0120472823751378    -0.0001776365849400     0.0006146097644712     0.0004223657456320
+         0.0008439870377019     0.0023495762333201     0.0002137876544272    -0.0005117900477540    -0.0014951694569210    -0.0362316002655150    -0.0114969619095509     0.0224594574056061     0.0009873096200806    -0.0006213479862998
+        -0.0004477856966785    -0.0011322107122810     0.0005560462007014    -0.0004062099112327    -0.0010909080264402    -0.0009168262041183    -0.0008985272122411     0.0005740720929736    -0.0006057268743922     0.0005990964934623
+
+         0.0023247963240263     0.0033623538411292     0.0073909558024901     0.0008737842135744    -0.0002229921246402     0.0103779570309949    -0.0004030532936573    -0.0008005558085389    -0.0013245086507000     0.0009550518227660
+         0.0005684190846862     0.0008952591575631     0.0016761249725831    -0.0013419833986000    -0.0018016409330470     0.0122306774487396    -0.0082524580868111    -0.0072381449232799    -0.0023633212114619     0.0168356028374976
+        -0.0079087174351662    -0.0002644390361956    -0.0002467465625129    -0.0002126271949777    -0.0003896760503647     0.0005975383199780    -0.0031467536292765     0.0004697137488920    -0.0001218490048947     0.0004257681764019
+        -0.0062832310890561     0.0003309732201569    -0.0005746176545519    -0.0001397342577994    -0.0003255618781696    -0.0009332599171161     0.0043610619802855     0.0056269432465131     0.0000491785329300    -0.0001994275646597
+        -0.0005706133098004    -0.0027895959210060    -0.0009336854821957    -0.0012246458163255    -0.0001332231262719    -0.0007615476179712     0.0006055373772395    -0.0005389500455378    -0.0028713108792391     0.0003798863604430
+        -0.0007797784863652    -0.0006567419192796     0.0029234709762563     0.0006893817306400     0.0012136747331268    -0.0003348840193678     0.0005945696239552     0.0003798156649126    -0.0000052007350112    -0.0162941982769914
+         0.0001076330322435     0.0000374496247091    -0.0008415053078857    -0.0013982628546419     0.0010435577505586     0.0006880143751595    -0.0001357743591343    -0.0002482671181660     0.0011457846430694     0.0000757092242443
+         0.0004476891020384    -0.0002237219498036     0.0013440401556083    -0.0011694157266112     0.0012111945273717    -0.0000605714040946     0.0002167825777419     0.0001133267885034    -0.0008525404782215     0.0014944385880088
+         0.0028138702676583    -0.0054492730185915     0.0006189068547033    -0.0023416604816399     0.0094561600015798     0.0079945511377858    -0.0000326433162160     0.0005684190846862     0.0008952591575631     0.0016761249725831
+        -0.0425913005596964    -0.0089050186445459     0.0040131497342920    -0.0087497932196675     0.0037597454285652    -0.0004030532936573     0.0049454060129403    -0.0054995840615581     0.0007100956903435    -0.0007670660150661
+        -3.1772372724087834     0.0077451297688916     0.0091161543530063     0.0070999691739269     0.0097221921269973    -0.0008005558085389    -0.0054995840615581     0.0064066157376618     0.0001272395953703     0.0000709064538133
+         0.0077451297688916    -3.2288863594324742    -0.0041422928046988    -0.0267295055736571    -0.0033968004669636    -0.0013245086507000     0.0007100956903435     0.0001272395953703     0.0018015679152104    -0.0027488761188045
+         0.0091161543530063    -0.0041422928046988    -3.2145941540632896    -0.0005052214928324     0.0234325651664274     0.0009550518227660    -0.0007670660150661     0.0000709064538133    -0.0027488761188045     0.0083572013534948
+         0.0070999691739269    -0.0267295055736571    -0.0005052214928324    -3.2692803082926880    -0.0068484233186096    -0.0012400280630591     0.0003911110421036     0.0008347566517066    -0.0044029008677081     0.0021843129423927
+         0.0097221921269973    -0.0033968004669636     0.0234325651664274    -0.0068484233186096    -3.2232546121848591     0.0013078145384797     0.0001399500838268     0.0002227219903882     0.0012942316569209     0.0022959194507257
+        -0.0008005558085389    -0.0013245086507000     0.0009550518227660    -0.0012400280630591     0.0013078145384797    -3.5776483185631438    -0.0185297520471116    -0.0156105916335759    -0.0013800024227112    -0.0049536616569797
+        -0.0054995840615581     0.0007100956903435    -0.0007670660150661     0.0003911110421036     0.0001399500838268    -0.0185297520471116    -3.0616846705086274    -0.0716624195924833    -0.0065812004104077     0.0005958017655746
+         0.0064066157376618     0.0001272395953703     0.0000709064538133     0.0008347566517066     0.0002227219903882    -0.0156105916335759    -0.0716624195924833    -3.0381980234950623     0.0089683723928398     0.0103312119602868
+         0.0001272395953703     0.0018015679152104    -0.0027488761188045    -0.0044029008677081     0.0012942316569209    -0.0013800024227112    -0.0065812004104077     0.0089683723928398    -3.0966700783738186    -0.0142951909443843
+         0.0000709064538133    -0.0027488761188045     0.0083572013534948     0.0021843129423927     0.0022959194507257    -0.0049536616569797     0.0005958017655746     0.0103312119602868    -0.0142951909443843    -3.0722663697374544
+         0.0008347566517066    -0.0044029008677081     0.0021843129423927     0.0061190765261624    -0.0036728450005627     0.0012880575830558    -0.0073403901581791     0.0104599079810265    -0.0415317049649393     0.0033084300795810
+         0.0002227219903882     0.0012942316569209     0.0022959194507257    -0.0036728450005627     0.0071938228999455     0.0001950585829010     0.0032945378868170     0.0106058373593949    -0.0044887534547216     0.0442857647035147
+        -0.0000906057841440     0.0002725682793906     0.0003052743086404    -0.0003488481070478    -0.0002009753887385     0.0006272397323558     0.0005975383199780     0.0008916839458059     0.0006589508483057     0.0005429700515907
+        -0.0003333021498815    -0.0004471277445620     0.0006105439037341    -0.0006233604116188    -0.0005970231891259    -0.0000326433162160     0.0019175518851102     0.0006592015415139    -0.0003201229112734    -0.0003612987882628
+         0.0074046626272697     0.0001952539927664     0.0000332338866002    -0.0000380353829001    -0.0000811928300619     0.0008916839458059     0.0004697137488920    -0.0031763636665091     0.0001984766910104    -0.0007508243694627
+         0.0001952539927664     0.0042583927037516    -0.0001322718630138    -0.0011590571073567    -0.0002099286519390     0.0006589508483057    -0.0001218490048947     0.0001984766910104     0.0043729087095977     0.0006169303111127
+         0.0000332338866002    -0.0001322718630138     0.0047096747992198    -0.0002241754326548     0.0020200531881526     0.0005429700515907     0.0004257681764019    -0.0007508243694627     0.0006169303111127     0.0021570870937834
+        -0.0000380353829001    -0.0011590571073567    -0.0002241754326548     0.0009341838514032    -0.0007567948127510     0.0004842238196106    -0.0001116767320023     0.0001957568488166     0.0000151749658835     0.0005339202080337
+        -0.0000811928300619    -0.0002099286519390     0.0020200531881526    -0.0007567948127510     0.0033771056979538     0.0002106754830618     0.0002055224097577    -0.0001592472039696    -0.0000694504600011    -0.0011099605094439
+         0.0038527122891859     0.0019871467742011     0.0023452262804666     0.0003936505216251     0.0009815070120140     0.0077138360145089    -0.0003333021498815    -0.0009332599171161    -0.0002541002159793    -0.0006299401924475
+         0.0009332599171161    -0.0000995369362065     0.0002174195944008     0.0003830732896112     0.0017100795030433    -0.0005684190846862    -0.0006592015415139    -0.0015843635972472    -0.0001841125372042     0.0000156327345194
+        -0.0041361793621267    -0.0003620229900076     0.0000328053733865    -0.0000719763547908    -0.0001296134057698    -0.0003333021498815     0.0065730996393518     0.0043610619802855    -0.0001744684336959     0.0004664982637121
+         0.0003309732201569    -0.0069925410014158     0.0013198185030439    -0.0000601598559675     0.0002869589568788    -0.0002541002159793    -0.0001744684336959     0.0000491785329300     0.0061537518478787    -0.0002592472009457
+        -0.0005746176545519     0.0013198185030439    -0.0095979466351709    -0.0001529202396159    -0.0005282630018058    -0.0006299401924475     0.0004664982637121    -0.0001994275646597    -0.0002592472009457     0.0053629573387883
+        -0.0001397342577994    -0.0000601598559675    -0.0001529202396159    -0.0089230787382668    -0.0014947087588726     0.0000431178460210    -0.0002383946997713     0.0000887382250933    -0.0001129903117861    -0.0001111993623714
+        -0.0003255618781696     0.0002869589568788    -0.0005282630018058    -0.0014947087588726    -0.0073728685061878    -0.0007571848379388     0.0000259743497158    -0.0001349694711776    -0.0000245747622370     0.0001703817549583
+        -0.0019871467742011    -0.0040200352543941    -0.0010725047406011    -0.0009304615390300    -0.0006798954439374    -0.0022640230029156     0.0004471277445620    -0.0000995369362065    -0.0007615476179712    -0.0002356054892580
+        -0.0002541002159793     0.0007615476179712    -0.0003034978857117    -0.0001169980866690    -0.0009685682842788     0.0008952591575631    -0.0003201229112734     0.0001841125372042     0.0023734703309500     0.0007064562633282
+         0.0003209262303069     0.0007895154580319    -0.0001943167215190     0.0002408064668346     0.0000739240356612     0.0004471277445620    -0.0047944308122098     0.0029985015753972     0.0006055373772395    -0.0001358515653513
+        -0.0019750358860548    -0.0005706133098004     0.0003686727857314     0.0001652749854497     0.0002704202119273    -0.0000995369362065     0.0029985015753972    -0.0054779836287013    -0.0005389500455378     0.0001907306042493
+         0.0003686727857314    -0.0009336854821957     0.0000747294871977     0.0006804184021987     0.0002911491438863    -0.0002356054892580    -0.0001358515653513     0.0001907306042493     0.0003798863604430    -0.0031435022341784
+         0.0001652749854497    -0.0012246458163255     0.0006804184021987    -0.0013001748147744     0.0007608035075028     0.0001399930368415     0.0003225477480982    -0.0001239444487830    -0.0002581642370727     0.0002649881422607
+         0.0002704202119273    -0.0001332231262719     0.0002911491438863     0.0007608035075028    -0.0010187258090548     0.0006146097644712    -0.0000139991724501     0.0000112553487054    -0.0000987555603829    -0.0008988134048218
+         0.0023452262804666     0.0010725047406011     0.0042607939917125    -0.0003063754525252     0.0008439870377019    -0.0141354596678098     0.0006105439037341    -0.0002174195944008    -0.0003034978857117    -0.0003348840193678
+         0.0006299401924475    -0.0002356054892580     0.0003348840193678     0.0001886644862700     0.0013328266394818    -0.0016761249725831     0.0003612987882628     0.0000156327345194    -0.0007064562633282    -0.0029651713395952
+        -0.0044627624680706    -0.0003480059066565    -0.0000603631492684    -0.0003008069867104    -0.0004593449937413     0.0006105439037341    -0.0152455854805274     0.0071304221324055    -0.0002707738771334     0.0005945696239552
+        -0.0002606409408044     0.0002375377446849    -0.0007797784863652    -0.0001387639909931    -0.0005675430414954    -0.0002174195944008     0.0071304221324055    -0.0169676410793276    -0.0002513375177619     0.0003798156649126
+         0.0002375377446849     0.0010801248615556    -0.0006567419192796    -0.0019239919915787     0.0004583750744133    -0.0003034978857117    -0.0002707738771334    -0.0002513375177619    -0.0152892019311890    -0.0000052007350112
+        -0.0001387639909931    -0.0019239919915787     0.0006893817306400     0.0004787082783534    -0.0025629705673762    -0.0004313717873216    -0.0003375143453232    -0.0004018540129850     0.0015801477747676    -0.0004448628270349
+        -0.0005675430414954     0.0004583750744133     0.0012136747331268    -0.0025629705673762     0.0024533667399230    -0.0009873096200806     0.0001259242026446     0.0000263602621206     0.0004492229037438    -0.0016093997458248
+        -0.0003936505216251    -0.0009304615390300     0.0003063754525252    -0.0033929522268926     0.0004477856966785    -0.0133707243891015     0.0006233604116188     0.0003830732896112     0.0001169980866690     0.0001886644862700
+         0.0000431178460210    -0.0001399930368415    -0.0004313717873216    -0.0006880143751595     0.0008529848013036    -0.0013419833986000     0.0003547569522288     0.0000792030523303     0.0010291436753520    -0.0007006636139039
+        -0.0029492509788060     0.0000560643174712    -0.0004182475830022    -0.0000161280144041    -0.0001116196754281     0.0006233604116188    -0.0141470925594981     0.0035258185574029    -0.0000587675277547     0.0004306702102859
+         0.0036115594101669     0.0000580190641313     0.0006241856195955     0.0001076330322435     0.0003162199022057     0.0003830732896112     0.0035258185574029    -0.0149788610444675    -0.0001851844573276    -0.0001498172479063
+         0.0000580190641313    -0.0023752489484722    -0.0007811510511717     0.0000374496247091     0.0003522547843766     0.0001169980866690    -0.0000587675277547    -0.0001851844573276    -0.0121109751802915     0.0003917628770900
+         0.0006241856195955    -0.0007811510511717     0.0014252539344529    -0.0008415053078857     0.0013640867084128     0.0001886644862700     0.0004306702102859    -0.0001498172479063     0.0003917628770900    -0.0133384355315758
+         0.0003162199022057     0.0003522547843766     0.0013640867084128     0.0010435577505586    -0.0000621910208180    -0.0006057268743922    -0.0000861300960987    -0.0003261163949170    -0.0000317167291753    -0.0013997597144717
+         0.0009815070120140     0.0006798954439374     0.0008439870377019    -0.0004477856966785     0.0033235843121336     0.0259263456314349    -0.0005970231891259    -0.0017100795030433    -0.0009685682842788    -0.0013328266394818
+         0.0007571848379388     0.0006146097644712     0.0009873096200806    -0.0006057268743922     0.0000605714040946     0.0018016409330470    -0.0009496716475220    -0.0010236364829457     0.0003407043442677     0.0023495762333201
+        -0.0024639009000980     0.0004223657456320    -0.0006213479862998     0.0005990964934623     0.0002563852686107    -0.0005970231891259     0.0201948179388331    -0.0032286553626393     0.0006766279729867    -0.0003840262105788
+         0.0018651766462542     0.0003692455181617    -0.0000104276306718     0.0003949396763810     0.0004476891020384    -0.0017100795030433    -0.0032286553626393     0.0211462703386045     0.0002569391433956    -0.0004467848935185
+         0.0003692455181617     0.0004572132321840    -0.0000459950114892    -0.0006003878532383    -0.0002237219498036    -0.0009685682842788     0.0006766279729867     0.0002569391433956     0.0238914706955879    -0.0005542411049345
+        -0.0000104276306718    -0.0000459950114892     0.0021936634167363    -0.0000047477112895     0.0013440401556083    -0.0013328266394818    -0.0003840262105788    -0.0004467848935185    -0.0005542411049345     0.0241322063485019
+         0.0003949396763810    -0.0006003878532383    -0.0000047477112895     0.0003060160576742    -0.0011694157266112     0.0008529848013036     0.0005952950256577     0.0009991300709510    -0.0024433301949304     0.0012679951233439
+
+        -0.0012400280630591     0.0013078145384797     0.0030512945792377     0.0004030532936573    -0.0000906057841440     0.0002725682793906     0.0003052743086404    -0.0003488481070478    -0.0002009753887385    -0.0192255862204958
+        -0.0101925423504457    -0.0205766457452679    -0.0000326433162160     0.0127138798305130     0.0006592015415139    -0.0003201229112734    -0.0003612987882628     0.0003547569522288     0.0009496716475220    -0.0005684190846862
+        -0.0001116767320023     0.0002055224097577    -0.0077974825818659     0.0076081753729784    -0.0919902070569251    -0.0058536289748745     0.0012700055376941    -0.0058572353886240     0.0016704243497348     0.0079087174351662
+         0.0000887382250933    -0.0001349694711776    -0.0041361793621267    -0.0043610619802855    -0.0934166405137827    -0.0057695230971876     0.0059344797109742    -0.0078314089262978     0.0023751506345056    -0.0106175588074134
+        -0.0002581642370727    -0.0000987555603829     0.0007895154580319    -0.0006055373772395    -0.0001069087224813     0.0006755050151318    -0.0006906476654997    -0.0002084937923348     0.0003622078779933     0.0005706133098004
+        -0.0004448628270349    -0.0016093997458248    -0.0000603631492684    -0.0005945696239552    -0.0005720012088148     0.0006008640944249    -0.0042327129122880     0.0001157278223723    -0.0021487474635167     0.0007797784863652
+        -0.0106221066285659    -0.0000478942975274    -0.0000161280144041     0.0001357743591343    -0.0008305286025775    -0.0001636547429671    -0.0004751369146538    -0.0001287974862858     0.0002840330107916    -0.0001076330322435
+        -0.0016833087083127     0.0236877020525974     0.0002563852686107    -0.0002167825777419     0.0003111900149557     0.0004195714907169    -0.0009309727442424     0.0008175493774043     0.0009396150312703    -0.0004476891020384
+        -0.0013419833986000    -0.0018016409330470     0.0004030532936573    -0.0052991264363304    -0.0003333021498815    -0.0004471277445620     0.0006105439037341    -0.0006233604116188    -0.0005970231891259    -0.0008005558085389
+         0.0003911110421036     0.0001399500838268    -0.0020825132543685    -0.0005975383199780    -0.0079087174351662    -0.0002644390361956    -0.0002467465625129    -0.0002126271949777    -0.0003896760503647     0.0000906057841440
+         0.0008347566517066     0.0002227219903882    -0.0000906057841440    -0.0003333021498815     0.0074046626272697     0.0001952539927664     0.0000332338866002    -0.0000380353829001    -0.0000811928300619     0.0038527122891859
+        -0.0044029008677081     0.0012942316569209     0.0002725682793906    -0.0004471277445620     0.0001952539927664     0.0042583927037516    -0.0001322718630138    -0.0011590571073567    -0.0002099286519390     0.0019871467742011
+         0.0021843129423927     0.0022959194507257     0.0003052743086404     0.0006105439037341     0.0000332338866002    -0.0001322718630138     0.0047096747992198    -0.0002241754326548     0.0020200531881526     0.0023452262804666
+         0.0061190765261624    -0.0036728450005627    -0.0003488481070478    -0.0006233604116188    -0.0000380353829001    -0.0011590571073567    -0.0002241754326548     0.0009341838514032    -0.0007567948127510     0.0003936505216251
+        -0.0036728450005627     0.0071938228999455    -0.0002009753887385    -0.0005970231891259    -0.0000811928300619    -0.0002099286519390     0.0020200531881526    -0.0007567948127510     0.0033771056979538     0.0009815070120140
+         0.0012880575830558     0.0001950585829010     0.0006272397323558    -0.0000326433162160     0.0008916839458059     0.0006589508483057     0.0005429700515907     0.0004842238196106     0.0002106754830618     0.0077138360145089
+        -0.0073403901581791     0.0032945378868170     0.0005975383199780     0.0019175518851102     0.0004697137488920    -0.0001218490048947     0.0004257681764019    -0.0001116767320023     0.0002055224097577    -0.0003333021498815
+         0.0104599079810265     0.0106058373593949     0.0008916839458059     0.0006592015415139    -0.0031763636665091     0.0001984766910104    -0.0007508243694627     0.0001957568488166    -0.0001592472039696    -0.0009332599171161
+        -0.0415317049649393    -0.0044887534547216     0.0006589508483057    -0.0003201229112734     0.0001984766910104     0.0043729087095977     0.0006169303111127     0.0000151749658835    -0.0000694504600011    -0.0002541002159793
+         0.0033084300795810     0.0442857647035147     0.0005429700515907    -0.0003612987882628    -0.0007508243694627     0.0006169303111127     0.0021570870937834     0.0005339202080337    -0.0011099605094439    -0.0006299401924475
+        -3.1466298866149987    -0.0141104190839428     0.0004842238196106     0.0003547569522288     0.0001957568488166     0.0000151749658835     0.0005339202080337     0.0037748997378647    -0.0006369725615989     0.0000431178460210
+        -0.0141104190839428    -3.1007044298213202     0.0002106754830618     0.0009496716475220    -0.0001592472039696    -0.0000694504600011    -0.0011099605094439    -0.0006369725615989     0.0033354998109041    -0.0007571848379388
+         0.0004842238196106     0.0002106754830618    -3.5860075276269114     0.0028617871737403    -0.0099859830200273    -0.0009771127402276     0.0007811041346163     0.0005280865901953    -0.0002087248373861    -0.0410716627356759
+         0.0003547569522288     0.0009496716475220     0.0028617871737403    -3.5908123661174334     0.0016731338925012    -0.0029188652092973    -0.0004912189580142    -0.0015652923112433     0.0037246323089780    -0.0054995840615581
+         0.0001957568488166    -0.0001592472039696    -0.0099859830200273     0.0016731338925012    -3.3809016461505426     0.0072884846048029     0.0046350227630293     0.0072310025557451     0.0065538485136010    -0.0041361793621267
+         0.0000151749658835    -0.0000694504600011    -0.0009771127402276    -0.0029188652092973     0.0072884846048029    -3.0934098885189623    -0.0030515123290861    -0.0500462543386863    -0.0063192825096941    -0.0003209262303069
+         0.0005339202080337    -0.0011099605094439     0.0007811041346163    -0.0004912189580142     0.0046350227630293    -0.0030515123290861    -3.0928327593377851     0.0147972009160157     0.0216242400653481    -0.0044627624680706
+         0.0037748997378647    -0.0006369725615989     0.0005280865901953    -0.0015652923112433     0.0072310025557451    -0.0500462543386863     0.0147972009160157    -3.1426368339651312    -0.0267446953968075     0.0029492509788060
+        -0.0006369725615989     0.0033354998109041    -0.0002087248373861     0.0037246323089780     0.0065538485136010    -0.0063192825096941     0.0216242400653481    -0.0267446953968075    -3.0883190720563793    -0.0024639009000980
+         0.0000431178460210    -0.0007571848379388    -0.0410716627356759    -0.0054995840615581    -0.0041361793621267    -0.0003209262303069    -0.0044627624680706     0.0029492509788060    -0.0024639009000980    -3.6080103282735108
+        -0.0000792030523303    -0.0010236364829457    -0.0054995840615581    -0.0120005437028890    -0.0043610619802855     0.0029985015753972    -0.0071304221324055     0.0035258185574029     0.0032286553626393     0.0014005774490189
+        -0.0002383946997713     0.0000259743497158     0.0079087174351662     0.0004697137488920     0.4071467349282019     0.0006131819477916     0.0094690678345650     0.0024650798238191     0.0066223442612590    -0.0058259629835115
+        -0.0001129903117861    -0.0000245747622370    -0.0003209262303069     0.0029985015753972    -0.0057695230971876    -0.0357337851499041     0.0106804628743383     0.0309758949686719     0.0085492035126860    -0.0009917284659646
+        -0.0001111993623714     0.0001703817549583    -0.0044627624680706    -0.0071304221324055     0.0059344797109742     0.0106804628743383    -0.0850407401720758    -0.0095204344810432    -0.0340338953097298    -0.0001352459487999
+         0.0048455763049067     0.0008395159904560     0.0029492509788060     0.0035258185574029    -0.0078314089262978     0.0309758949686719    -0.0095204344810432    -0.0036586088837036     0.0253350139729255     0.0012779925363571
+         0.0008395159904560     0.0042895039445656    -0.0024639009000980     0.0032286553626393     0.0023751506345056     0.0085492035126860    -0.0340338953097298     0.0253350139729255    -0.0527277629734795    -0.0006863517588217
+         0.0001399930368415     0.0006146097644712     0.0007601686306623    -0.0007100956903435     0.0003620229900076     0.0007895154580319     0.0003480059066565     0.0000560643174712    -0.0004223657456320     0.0035171638073412
+         0.0010291436753520    -0.0003407043442677    -0.0007100956903435     0.0030839868648005    -0.0001744684336959    -0.0006055373772395    -0.0002707738771334     0.0000587675277547     0.0006766279729867     0.0001272395953703
+         0.0003225477480982    -0.0000139991724501    -0.0002644390361956     0.0001218490048947    -0.0006131819477916    -0.0011661827330583     0.0004319349038058    -0.0009811544682546    -0.0003920073716775    -0.0001952539927664
+        -0.0001239444487830     0.0000112553487054     0.0003620229900076    -0.0001744684336959     0.0040725994800798    -0.0001069087224813    -0.0000960217196631    -0.0008346357708956    -0.0004013609368741     0.0003309732201569
+         0.0002649881422607    -0.0008988134048218     0.0003480059066565    -0.0002707738771334    -0.0000960217196631    -0.0006906476654997     0.0014315622536175    -0.0000200955732530    -0.0005544785311603     0.0002375377446849
+        -0.0005257306596570    -0.0004171752715067     0.0000560643174712     0.0000587675277547    -0.0008346357708956    -0.0002084937923348    -0.0000200955732530     0.0013487772277863     0.0002625402763287    -0.0000580190641313
+        -0.0004171752715067    -0.0014752188569619    -0.0004223657456320     0.0006766279729867    -0.0004013609368741     0.0003622078779933    -0.0005544785311603     0.0002625402763287     0.0007569707360760     0.0003692455181617
+        -0.0004313717873216    -0.0009873096200806    -0.0017535315220845    -0.0007670660150661     0.0000328053733865     0.0001943167215190    -0.0000603631492684     0.0004182475830022    -0.0006213479862998    -0.0006406851650155
+         0.0007006636139039     0.0023495762333201    -0.0007670660150661     0.0016638164466329    -0.0004664982637121    -0.0001358515653513    -0.0005945696239552     0.0004306702102859     0.0003840262105788    -0.0000709064538133
+        -0.0003375143453232     0.0001259242026446     0.0002467465625129     0.0004257681764019     0.0094690678345650    -0.0004319349038058     0.0013908341078775    -0.0005831194399916     0.0002137876544272     0.0000332338866002
+        -0.0004018540129850     0.0000263602621206     0.0000328053733865    -0.0004664982637121    -0.0012137066293079    -0.0001283063757233    -0.0005720012088148    -0.0002412654876314    -0.0003414312821772     0.0005746176545519
+         0.0015801477747676     0.0004492229037438     0.0001943167215190    -0.0001358515653513    -0.0001283063757233     0.0000266027526231     0.0006008640944249     0.0006395095184393     0.0005519730901645     0.0003686727857314
+        -0.0138970374768706     0.0019193198602103     0.0004182475830022     0.0004306702102859    -0.0002412654876314     0.0006395095184393     0.0001157278223723    -0.0000765314602273     0.0007464287182564     0.0006241856195955
+         0.0019193198602103    -0.0156384389980703    -0.0006213479862998     0.0003840262105788    -0.0003414312821772     0.0005519730901645    -0.0021487474635167     0.0007464287182564    -0.0025882701177865     0.0000104276306718
+         0.0006880143751595    -0.0006057268743922     0.0019177165239071    -0.0003911110421036     0.0000719763547908     0.0002408064668346     0.0003008069867104    -0.0000161280144041    -0.0005990964934623     0.0065121257991484
+         0.0024474860447547     0.0011322107122810    -0.0003911110421036     0.0033271195853956    -0.0002383946997713    -0.0003225477480982    -0.0003375143453232     0.0001357743591343     0.0005952950256577     0.0008347566517066
+        -0.0001357743591343    -0.0000861300960987    -0.0002126271949777     0.0001116767320023    -0.0024650798238191    -0.0009811544682546     0.0005831194399916    -0.0017533167241978    -0.0005560462007014     0.0000380353829001
+        -0.0002482671181660    -0.0003261163949170     0.0000719763547908    -0.0002383946997713     0.0055773679185129    -0.0007310506403026    -0.0000883293475083    -0.0008305286025775    -0.0007509077089406    -0.0001397342577994
+         0.0011457846430694    -0.0000317167291753     0.0002408064668346    -0.0003225477480982    -0.0007310506403026     0.0013011022156966     0.0000834722858044    -0.0001636547429671     0.0001510271615951    -0.0001652749854497
+         0.0000757092242443    -0.0013997597144717     0.0003008069867104    -0.0003375143453232    -0.0000883293475083     0.0000834722858044     0.0013964306492418    -0.0004751369146538     0.0003299194995199    -0.0001387639909931
+        -0.0000478942975274    -0.0119372094650806    -0.0005990964934623     0.0005952950256577    -0.0007509077089406     0.0001510271615951     0.0003299194995199     0.0002840330107916     0.0008299265062053     0.0003949396763810
+         0.0008529848013036    -0.0000605714040946     0.0021846251895294     0.0001399500838268    -0.0001296134057698    -0.0000739240356612    -0.0004593449937413     0.0001116196754281     0.0002563852686107    -0.0029301507641298
+        -0.0011322107122810    -0.0056846157378175     0.0001399500838268     0.0026498327312777    -0.0000259743497158    -0.0000139991724501    -0.0001259242026446    -0.0000861300960987    -0.0002167825777419    -0.0002227219903882
+         0.0005952950256577     0.0002167825777419     0.0003896760503647     0.0002055224097577     0.0066223442612590     0.0003920073716775     0.0002137876544272     0.0005560462007014     0.0008121343882754    -0.0000811928300619
+         0.0009991300709510     0.0001133267885034    -0.0001296134057698    -0.0000259743497158     0.0025485318513537     0.0002380820799062    -0.0001056877621741     0.0005616852861621     0.0003111900149557     0.0003255618781696
+        -0.0024433301949304    -0.0008525404782215    -0.0000739240356612    -0.0000139991724501     0.0002380820799062     0.0011220816622939     0.0003853774738894     0.0007956274962875     0.0004195714907169     0.0002704202119273
+         0.0012679951233439     0.0014944385880088    -0.0004593449937413    -0.0001259242026446    -0.0001056877621741     0.0003853774738894    -0.0003115555610629    -0.0003050686931369    -0.0009309727442424     0.0005675430414954
+         0.0224029264293815    -0.0016833087083127     0.0001116196754281    -0.0000861300960987     0.0005616852861621     0.0007956274962875    -0.0003050686931369     0.0019963266783840     0.0008175493774043     0.0003162199022057
+
+        -0.0008005558085389     0.0000906057841440     0.0019871467742011     0.0023452262804666     0.0003936505216251     0.0009815070120140     0.0023790464210389     0.0013245086507000     0.0002725682793906    -0.0019871467742011
+        -0.0023381791764293    -0.0006592015415139    -0.0001841125372042     0.0000156327345194    -0.0000792030523303    -0.0010236364829457     0.0008952591575631    -0.0053499748100452    -0.0003201229112734     0.0001841125372042
+         0.0004697137488920     0.0083272437615528     0.0006131819477916     0.0094690678345650     0.0024650798238191     0.0066223442612590    -0.0002644390361956     0.0001218490048947     0.0038115583003338    -0.0006131819477916
+         0.0007269774996625     0.0097536772184105     0.0058847928649605     0.0062143037631301     0.0052867655919482     0.0071987249789467     0.0003309732201569    -0.0000491785329300    -0.0057695230971876     0.0053775007112722
+        -0.0005389500455378     0.0001069087224813     0.0034288859628392    -0.0010801667131386    -0.0007904454971224    -0.0001354435527023    -0.0018062885009157    -0.0048419851422680    -0.0089896822600765     0.0078334076133936
+         0.0003798156649126     0.0005720012088148    -0.0002917355537812     0.0047507548057081     0.0014903138313599     0.0006444871437305    -0.0006567419192796     0.0000052007350112     0.0006008640944249     0.0002917355537812
+        -0.0002482671181660     0.0008305286025775    -0.0005204896283825     0.0003973227981271     0.0039452237506307    -0.0012484457125895     0.0000374496247091    -0.0011457846430694    -0.0001636547429671     0.0005204896283825
+         0.0001133267885034    -0.0003111900149557     0.0000997802824742     0.0001507588966625    -0.0006843677720252    -0.0005996136317504    -0.0002237219498036     0.0008525404782215     0.0004195714907169    -0.0000997802824742
+        -0.0012901982628935     0.0008916839458059    -0.0000995369362065     0.0002174195944008     0.0003830732896112     0.0017100795030433     0.0013245086507000    -0.0023633098428014    -0.0006589508483057    -0.0002541002159793
+         0.0008916839458059    -0.0069148068764421    -0.0003620229900076     0.0000328053733865    -0.0000719763547908    -0.0001296134057698     0.0002725682793906    -0.0006589508483057    -0.0019604201603179     0.0003209262303069
+         0.0009332599171161    -0.0041361793621267     0.0003309732201569    -0.0005746176545519    -0.0001397342577994    -0.0003255618781696    -0.0019871467742011    -0.0002541002159793     0.0003209262303069    -0.0019750358860548
+        -0.0000995369362065    -0.0003620229900076    -0.0069925410014158     0.0013198185030439    -0.0000601598559675     0.0002869589568788    -0.0040200352543941     0.0007615476179712     0.0007895154580319    -0.0005706133098004
+         0.0002174195944008     0.0000328053733865     0.0013198185030439    -0.0095979466351709    -0.0001529202396159    -0.0005282630018058    -0.0010725047406011    -0.0003034978857117    -0.0001943167215190     0.0003686727857314
+         0.0003830732896112    -0.0000719763547908    -0.0000601598559675    -0.0001529202396159    -0.0089230787382668    -0.0014947087588726    -0.0009304615390300    -0.0001169980866690     0.0002408064668346     0.0001652749854497
+         0.0017100795030433    -0.0001296134057698     0.0002869589568788    -0.0005282630018058    -0.0014947087588726    -0.0073728685061878    -0.0006798954439374    -0.0009685682842788     0.0000739240356612     0.0002704202119273
+        -0.0005684190846862    -0.0003333021498815    -0.0002541002159793    -0.0006299401924475     0.0000431178460210    -0.0007571848379388    -0.0022640230029156     0.0008952591575631     0.0004471277445620    -0.0000995369362065
+        -0.0006592015415139     0.0065730996393518    -0.0001744684336959     0.0004664982637121    -0.0002383946997713     0.0000259743497158     0.0004471277445620    -0.0003201229112734    -0.0047944308122098     0.0029985015753972
+        -0.0015843635972472     0.0043610619802855     0.0000491785329300    -0.0001994275646597     0.0000887382250933    -0.0001349694711776    -0.0000995369362065     0.0001841125372042     0.0029985015753972    -0.0054779836287013
+        -0.0001841125372042    -0.0001744684336959     0.0061537518478787    -0.0002592472009457    -0.0001129903117861    -0.0000245747622370    -0.0007615476179712     0.0023734703309500     0.0006055373772395    -0.0005389500455378
+         0.0000156327345194     0.0004664982637121    -0.0002592472009457     0.0053629573387883    -0.0001111993623714     0.0001703817549583    -0.0002356054892580     0.0007064562633282    -0.0001358515653513     0.0001907306042493
+        -0.0000792030523303    -0.0002383946997713    -0.0001129903117861    -0.0001111993623714     0.0048455763049067     0.0008395159904560     0.0001399930368415     0.0010291436753520     0.0003225477480982    -0.0001239444487830
+        -0.0010236364829457     0.0000259743497158    -0.0000245747622370     0.0001703817549583     0.0008395159904560     0.0042895039445656     0.0006146097644712    -0.0003407043442677    -0.0000139991724501     0.0000112553487054
+        -0.0054995840615581     0.0079087174351662    -0.0003209262303069    -0.0044627624680706     0.0029492509788060    -0.0024639009000980     0.0007601686306623    -0.0007100956903435    -0.0002644390361956     0.0003620229900076
+        -0.0120005437028890     0.0004697137488920     0.0029985015753972    -0.0071304221324055     0.0035258185574029     0.0032286553626393    -0.0007100956903435     0.0030839868648005     0.0001218490048947    -0.0001744684336959
+        -0.0043610619802855     0.4071467349282019    -0.0057695230971876     0.0059344797109742    -0.0078314089262978     0.0023751506345056     0.0003620229900076    -0.0001744684336959    -0.0006131819477916     0.0040725994800798
+         0.0029985015753972     0.0006131819477916    -0.0357337851499041     0.0106804628743383     0.0309758949686719     0.0085492035126860     0.0007895154580319    -0.0006055373772395    -0.0011661827330583    -0.0001069087224813
+        -0.0071304221324055     0.0094690678345650     0.0106804628743383    -0.0850407401720758    -0.0095204344810432    -0.0340338953097298     0.0003480059066565    -0.0002707738771334     0.0004319349038058    -0.0000960217196631
+         0.0035258185574029     0.0024650798238191     0.0309758949686719    -0.0095204344810432    -0.0036586088837036     0.0253350139729255     0.0000560643174712     0.0000587675277547    -0.0009811544682546    -0.0008346357708956
+         0.0032286553626393     0.0066223442612590     0.0085492035126860    -0.0340338953097298     0.0253350139729255    -0.0527277629734795    -0.0004223657456320     0.0006766279729867    -0.0003920073716775    -0.0004013609368741
+         0.0014005774490189    -0.0058259629835115    -0.0009917284659646    -0.0001352459487999     0.0012779925363571    -0.0006863517588217     0.0035171638073412     0.0001272395953703    -0.0001952539927664     0.0003309732201569
+        -3.6035696649668139     0.0076377854102110    -0.0022353123928058    -0.0022132745568144    -0.0007335238262739     0.0046760847087493     0.0001272395953703     0.0022939211833929     0.0001984766910104    -0.0000491785329300
+         0.0076377854102110    -3.4171455920134912    -0.0055925877951285     0.0034733248415154    -0.0050901418250618     0.0033958387667410    -0.0001952539927664     0.0001984766910104     0.0039738089714299    -0.0057695230971876
+        -0.0022353123928058    -0.0055925877951285    -3.1128902460101329    -0.0003439761426260    -0.0419941344777913    -0.0041203228813821     0.0005706133098004    -0.0005389500455378     0.0001069087224813     0.0011374786198633
+        -0.0022132745568144     0.0034733248415154    -0.0003439761426260    -3.1245869906345773     0.0122290325394542     0.0130589490033175     0.0002375377446849     0.0002513375177619    -0.0001283063757233    -0.0004641507217966
+        -0.0007335238262739    -0.0050901418250618    -0.0419941344777913     0.0122290325394542    -3.1540273698849690    -0.0202342478650679    -0.0000580190641313    -0.0001851844573276     0.0007310506403026     0.0008104455987589
+         0.0046760847087493     0.0033958387667410    -0.0041203228813821     0.0130589490033175    -0.0202342478650679    -3.1120082906272142     0.0003692455181617    -0.0002569391433956     0.0002380820799062     0.0003085226372640
+         0.0001272395953703    -0.0001952539927664     0.0005706133098004     0.0002375377446849    -0.0000580190641313     0.0003692455181617    -4.1932509489686511     0.0060056252714703    -0.0089722329070296    -0.0099082488950536
+         0.0022939211833929     0.0001984766910104    -0.0005389500455378     0.0002513375177619    -0.0001851844573276    -0.0002569391433956     0.0060056252714703    -4.1956332535170171     0.0000885130341042     0.0012537861010280
+         0.0001984766910104     0.0039738089714299     0.0001069087224813    -0.0001283063757233     0.0007310506403026     0.0002380820799062    -0.0089722329070296     0.0000885130341042    -3.6632453680533557    -0.0479291781454681
+        -0.0000491785329300    -0.0057695230971876     0.0011374786198633    -0.0004641507217966     0.0008104455987589     0.0003085226372640    -0.0099082488950536     0.0012537861010280    -0.0479291781454681    -3.6464817796815781
+         0.0002513375177619    -0.0001283063757233    -0.0010801667131386     0.0052515521247908     0.0007753048217332     0.0008668911604131    -0.0014760117511600    -0.0005348354086759     0.0022330154595844     0.0148819730511543
+        -0.0001851844573276     0.0007310506403026    -0.0007904454971224     0.0007753048217332     0.0034103636678879    -0.0009550292217189    -0.0047088158222820    -0.0036014096904499    -0.0093664075278781     0.0077462705698859
+        -0.0002569391433956     0.0002380820799062    -0.0001354435527023     0.0008668911604131    -0.0009550292217189     0.0038759015485711     0.0007216116552485     0.0074212850657327     0.0048222889558007     0.0118872933134636
+        -0.0000709064538133     0.0000332338866002     0.0003686727857314     0.0007797784863652     0.0006241856195955     0.0000104276306718    -0.0011540756157827    -0.0027488761188045     0.0001322718630138     0.0013198185030439
+         0.0005743724422650     0.0007508243694627    -0.0001907306042493     0.0003798156649126     0.0001498172479063    -0.0004467848935185    -0.0027488761188045     0.0089988225239028     0.0006169303111127     0.0002592472009457
+         0.0007508243694627    -0.0051218167549925    -0.0000960217196631     0.0005720012088148    -0.0000883293475083     0.0001056877621741     0.0001322718630138     0.0006169303111127    -0.0022448560913954     0.0106804628743383
+        -0.0001994275646597    -0.0059344797109742     0.0004641507217966    -0.0018305876199334     0.0005621923875439    -0.0005117900477540     0.0013198185030439     0.0002592472009457     0.0106804628743383    -0.0049523922778555
+        -0.0001907306042493    -0.0000960217196631     0.0051251335331324    -0.0002917355537812    -0.0021949204282781    -0.0003100129743642     0.0009336854821957     0.0003798863604430     0.0006906476654997    -0.0010801667131386
+         0.0001498172479063    -0.0000883293475083    -0.0021949204282781     0.0014903138313599     0.0021207053465065    -0.0017985836218135     0.0007811510511717     0.0003917628770900    -0.0000834722858044     0.0002314071875919
+        -0.0004467848935185     0.0001056877621741    -0.0003100129743642     0.0006444871437305    -0.0017985836218135     0.0032495702293005    -0.0000459950114892     0.0005542411049345     0.0003853774738894    -0.0000385180526590
+         0.0008347566517066     0.0000380353829001    -0.0001652749854497    -0.0001387639909931    -0.0001076330322435     0.0003949396763810     0.0206876641399491     0.0044029008677081    -0.0011590571073567     0.0000601598559675
+         0.0031521869920488     0.0001957568488166    -0.0001239444487830     0.0004018540129850    -0.0002482671181660    -0.0009991300709510     0.0044029008677081     0.0058854647486669    -0.0000151749658835    -0.0001129903117861
+         0.0001957568488166     0.0063810924173302     0.0008346357708956    -0.0002412654876314     0.0008305286025775     0.0005616852861621    -0.0011590571073567    -0.0000151749658835    -0.0026290846250801    -0.0309758949686719
+        -0.0000887382250933    -0.0078314089262978     0.0008104455987589    -0.0005621923875439     0.0017301585510884     0.0004062099112327     0.0000601598559675    -0.0001129903117861    -0.0309758949686719     0.0054230352358149
+        -0.0001239444487830     0.0008346357708956     0.0058658244031894     0.0002314071875919    -0.0005204896283825    -0.0006470035774063    -0.0012246458163255     0.0002581642370727    -0.0002084937923348     0.0007904454971224
+         0.0004018540129850    -0.0002412654876314     0.0002314071875919     0.0064392407775809     0.0003973227981271     0.0016688822106802     0.0019239919915787     0.0015801477747676    -0.0006395095184393    -0.0021949204282781
+        -0.0009991300709510     0.0005616852861621    -0.0006470035774063     0.0016688822106802    -0.0012484457125895     0.0060589452798321     0.0006003878532383    -0.0024433301949304    -0.0007956274962875    -0.0005267859366097
+        -0.0002227219903882    -0.0000811928300619     0.0002704202119273     0.0005675430414954     0.0003162199022057    -0.0004476891020384    -0.0081721604120321     0.0012942316569209     0.0002099286519390     0.0002869589568788
+        -0.0020465055317322     0.0001592472039696    -0.0000112553487054     0.0000263602621206     0.0003261163949170     0.0001133267885034     0.0012942316569209    -0.0070802074242740    -0.0000694504600011     0.0000245747622370
+         0.0001592472039696    -0.0060984943775261    -0.0004013609368741     0.0003414312821772    -0.0007509077089406    -0.0003111900149557     0.0002099286519390    -0.0000694504600011    -0.0052496783693016     0.0085492035126860
+        -0.0001349694711776    -0.0023751506345056    -0.0003085226372640    -0.0005117900477540    -0.0004062099112327    -0.0009158566310066     0.0002869589568788     0.0000245747622370     0.0085492035126860    -0.0074486379976136
+        -0.0000112553487054    -0.0004013609368741    -0.0007650495776636     0.0000385180526590    -0.0005267859366097     0.0000997802824742     0.0001332231262719    -0.0000987555603829    -0.0003622078779933    -0.0001354435527023
+         0.0000263602621206     0.0003414312821772     0.0000385180526590    -0.0008475468113719     0.0000115215380989     0.0001507588966625     0.0004583750744133    -0.0004492229037438     0.0005519730901645     0.0003100129743642
+         0.0003261163949170    -0.0007509077089406    -0.0005267859366097     0.0000115215380989    -0.0012563586009136    -0.0006843677720252    -0.0003522547843766    -0.0000317167291753    -0.0001510271615951    -0.0006470035774063
+
+        -0.0010725047406011    -0.0009304615390300    -0.0006798954439374    -0.0077868426920945     0.0009550518227660    -0.0003052743086404     0.0023452262804666     0.0010725047406011    -0.0003063754525252     0.0008439870377019
+         0.0007064562633282     0.0010291436753520    -0.0003407043442677    -0.0016761249725831     0.0020812363149844     0.0003612987882628     0.0000156327345194    -0.0007064562633282     0.0007006636139039     0.0023495762333201
+         0.0004319349038058    -0.0009811544682546    -0.0003920073716775     0.0002467465625129     0.0004257681764019     0.0009896126745134     0.0094690678345650    -0.0004319349038058    -0.0005831194399916     0.0002137876544272
+        -0.0004641507217966     0.0008104455987589     0.0003085226372640     0.0005746176545519    -0.0001994275646597    -0.0059344797109742    -0.0035425357548917     0.0004641507217966     0.0005621923875439    -0.0005117900477540
+        -0.0217634682773767    -0.0167125668432297    -0.0018342331195999     0.0009336854821957     0.0003798863604430     0.0006906476654997    -0.0010801667131386     0.0164670998568952     0.0056565395854700    -0.0014951694569210
+        -0.0090208437886581    -0.0026919112614725    -0.0035299123092932    -0.0033193578658606    -0.0015398317544783     0.0064923311244955     0.0145075943237299     0.0037244753681766    -0.0034225819674494     0.0045658900231715
+         0.0102941873391865     0.0189727366233734    -0.0120472823751378     0.0008415053078857     0.0000757092242443     0.0004751369146538     0.0003973227981271    -0.0102941873391865    -0.0002251400992271    -0.0114969619095509
+        -0.0033313125278589     0.0012008757602207    -0.0113913242940556    -0.0013440401556083     0.0014944385880088     0.0009309727442424     0.0001507588966625     0.0033313125278589     0.0067016305597277    -0.0183380328830805
+        -0.0003034978857117    -0.0001169980866690    -0.0009685682842788     0.0009550518227660     0.0045577747673754     0.0005429700515907     0.0006299401924475    -0.0002356054892580     0.0001886644862700     0.0013328266394818
+        -0.0001943167215190     0.0002408064668346     0.0000739240356612    -0.0003052743086404     0.0005429700515907    -0.0011769910242206    -0.0044627624680706    -0.0003480059066565    -0.0003008069867104    -0.0004593449937413
+         0.0003686727857314     0.0001652749854497     0.0002704202119273     0.0023452262804666     0.0006299401924475    -0.0044627624680706    -0.0002606409408044     0.0002375377446849    -0.0001387639909931    -0.0005675430414954
+        -0.0009336854821957    -0.0012246458163255    -0.0001332231262719     0.0010725047406011    -0.0002356054892580    -0.0003480059066565     0.0002375377446849     0.0010801248615556    -0.0019239919915787     0.0004583750744133
+         0.0000747294871977     0.0006804184021987     0.0002911491438863     0.0042607939917125     0.0003348840193678    -0.0000603631492684    -0.0007797784863652    -0.0006567419192796     0.0006893817306400     0.0012136747331268
+         0.0006804184021987    -0.0013001748147744     0.0007608035075028    -0.0003063754525252     0.0001886644862700    -0.0003008069867104    -0.0001387639909931    -0.0019239919915787     0.0004787082783534    -0.0025629705673762
+         0.0002911491438863     0.0007608035075028    -0.0010187258090548     0.0008439870377019     0.0013328266394818    -0.0004593449937413    -0.0005675430414954     0.0004583750744133    -0.0025629705673762     0.0024533667399230
+        -0.0002356054892580     0.0001399930368415     0.0006146097644712    -0.0141354596678098    -0.0016761249725831     0.0006105439037341    -0.0002174195944008    -0.0003034978857117    -0.0004313717873216    -0.0009873096200806
+        -0.0001358515653513     0.0003225477480982    -0.0000139991724501     0.0006105439037341     0.0003612987882628    -0.0152455854805274     0.0071304221324055    -0.0002707738771334    -0.0003375143453232     0.0001259242026446
+         0.0001907306042493    -0.0001239444487830     0.0000112553487054    -0.0002174195944008     0.0000156327345194     0.0071304221324055    -0.0169676410793276    -0.0002513375177619    -0.0004018540129850     0.0000263602621206
+         0.0003798863604430    -0.0002581642370727    -0.0000987555603829    -0.0003034978857117    -0.0007064562633282    -0.0002707738771334    -0.0002513375177619    -0.0152892019311890     0.0015801477747676     0.0004492229037438
+        -0.0031435022341784     0.0002649881422607    -0.0008988134048218    -0.0003348840193678    -0.0029651713395952     0.0005945696239552     0.0003798156649126    -0.0000052007350112    -0.0004448628270349    -0.0016093997458248
+         0.0002649881422607    -0.0005257306596570    -0.0004171752715067    -0.0004313717873216     0.0007006636139039    -0.0003375143453232    -0.0004018540129850     0.0015801477747676    -0.0138970374768706     0.0019193198602103
+        -0.0008988134048218    -0.0004171752715067    -0.0014752188569619    -0.0009873096200806     0.0023495762333201     0.0001259242026446     0.0000263602621206     0.0004492229037438     0.0019193198602103    -0.0156384389980703
+         0.0003480059066565     0.0000560643174712    -0.0004223657456320    -0.0017535315220845    -0.0007670660150661     0.0002467465625129     0.0000328053733865     0.0001943167215190     0.0004182475830022    -0.0006213479862998
+        -0.0002707738771334     0.0000587675277547     0.0006766279729867    -0.0007670660150661     0.0016638164466329     0.0004257681764019    -0.0004664982637121    -0.0001358515653513     0.0004306702102859     0.0003840262105788
+        -0.0000960217196631    -0.0008346357708956    -0.0004013609368741     0.0000328053733865    -0.0004664982637121     0.0094690678345650    -0.0012137066293079    -0.0001283063757233    -0.0002412654876314    -0.0003414312821772
+        -0.0006906476654997    -0.0002084937923348     0.0003622078779933     0.0001943167215190    -0.0001358515653513    -0.0004319349038058    -0.0001283063757233     0.0000266027526231     0.0006395095184393     0.0005519730901645
+         0.0014315622536175    -0.0000200955732530    -0.0005544785311603    -0.0000603631492684    -0.0005945696239552     0.0013908341078775    -0.0005720012088148     0.0006008640944249     0.0001157278223723    -0.0021487474635167
+        -0.0000200955732530     0.0013487772277863     0.0002625402763287     0.0004182475830022     0.0004306702102859    -0.0005831194399916    -0.0002412654876314     0.0006395095184393    -0.0000765314602273     0.0007464287182564
+        -0.0005544785311603     0.0002625402763287     0.0007569707360760    -0.0006213479862998     0.0003840262105788     0.0002137876544272    -0.0003414312821772     0.0005519730901645     0.0007464287182564    -0.0025882701177865
+         0.0002375377446849    -0.0000580190641313     0.0003692455181617    -0.0006406851650155    -0.0000709064538133     0.0000332338866002     0.0005746176545519     0.0003686727857314     0.0006241856195955     0.0000104276306718
+         0.0002513375177619    -0.0001851844573276    -0.0002569391433956    -0.0000709064538133     0.0005743724422650     0.0007508243694627    -0.0001994275646597    -0.0001907306042493     0.0001498172479063    -0.0004467848935185
+        -0.0001283063757233     0.0007310506403026     0.0002380820799062     0.0000332338866002     0.0007508243694627    -0.0051218167549925    -0.0059344797109742    -0.0000960217196631    -0.0000883293475083     0.0001056877621741
+        -0.0010801667131386    -0.0007904454971224    -0.0001354435527023     0.0003686727857314    -0.0001907306042493    -0.0000960217196631     0.0004641507217966     0.0051251335331324    -0.0021949204282781    -0.0003100129743642
+         0.0052515521247908     0.0007753048217332     0.0008668911604131     0.0007797784863652     0.0003798156649126     0.0005720012088148    -0.0018305876199334    -0.0002917355537812     0.0014903138313599     0.0006444871437305
+         0.0007753048217332     0.0034103636678879    -0.0009550292217189     0.0006241856195955     0.0001498172479063    -0.0000883293475083     0.0005621923875439    -0.0021949204282781     0.0021207053465065    -0.0017985836218135
+         0.0008668911604131    -0.0009550292217189     0.0038759015485711     0.0000104276306718    -0.0004467848935185     0.0001056877621741    -0.0005117900477540    -0.0003100129743642    -0.0017985836218135     0.0032495702293005
+        -0.0014760117511600    -0.0047088158222820     0.0007216116552485    -0.0011540756157827    -0.0027488761188045     0.0001322718630138     0.0013198185030439     0.0009336854821957     0.0007811510511717    -0.0000459950114892
+        -0.0005348354086759    -0.0036014096904499     0.0074212850657327    -0.0027488761188045     0.0089988225239028     0.0006169303111127     0.0002592472009457     0.0003798863604430     0.0003917628770900     0.0005542411049345
+         0.0022330154595844    -0.0093664075278781     0.0048222889558007     0.0001322718630138     0.0006169303111127    -0.0022448560913954     0.0106804628743383     0.0006906476654997    -0.0000834722858044     0.0003853774738894
+         0.0148819730511543     0.0077462705698859     0.0118872933134636     0.0013198185030439     0.0002592472009457     0.0106804628743383    -0.0049523922778555    -0.0010801667131386     0.0002314071875919    -0.0000385180526590
+        -3.7083282078473534    -0.0055084958876831     0.0268846739191961    -0.0006567419192796     0.0000052007350112     0.0006008640944249     0.0002917355537812     0.0127384166865502    -0.0026919112614725    -0.0035299123092932
+        -0.0055084958876831    -3.7591488578456347     0.0005178000543849     0.0007811510511717     0.0003917628770900    -0.0000834722858044     0.0002314071875919     0.0056565395854700    -0.0014176984182979     0.0006897614478283
+         0.0268846739191961     0.0005178000543849    -3.7258982314329061    -0.0000459950114892     0.0005542411049345     0.0003853774738894    -0.0000385180526590    -0.0014951694569210     0.0006897614478283     0.0029797720011740
+        -0.0006567419192796     0.0007811510511717    -0.0000459950114892    -4.2155278673271814    -0.0005500081668141    -0.0085209508115614    -0.0073028432612985     0.0010580369072880    -0.0009083129393570    -0.0010148385293039
+         0.0000052007350112     0.0003917628770900     0.0005542411049345    -0.0005500081668141    -4.2077986686083699     0.0023043346499185     0.0004629915919377    -0.0045697937873287    -0.0023739493391656     0.0076620207186468
+         0.0006008640944249    -0.0000834722858044     0.0003853774738894    -0.0085209508115614     0.0023043346499185    -3.6992373625998933     0.0013777768767035    -0.0082336250215907    -0.0092710790943328     0.0062559261791575
+         0.0002917355537812     0.0002314071875919    -0.0000385180526590    -0.0073028432612985     0.0004629915919377     0.0013777768767035    -3.6947476480337405     0.0060107414514420     0.0071728541954944     0.0118047960797552
+         0.0127384166865502     0.0056565395854700    -0.0014951694569210     0.0010580369072880    -0.0045697937873287    -0.0082336250215907     0.0060107414514420    -3.7448973315750687    -0.0144988233374356     0.0018697407825527
+        -0.0026919112614725    -0.0014176984182979     0.0006897614478283    -0.0009083129393570    -0.0023739493391656    -0.0092710790943328     0.0071728541954944    -0.0144988233374356    -3.7696137165504839     0.0000311953046891
+        -0.0035299123092932     0.0006897614478283     0.0029797720011740    -0.0010148385293039     0.0076620207186468     0.0062559261791575     0.0118047960797552     0.0018697407825527     0.0000311953046891    -3.7493454444926368
+         0.0019239919915787     0.0000374496247091     0.0006003878532383     0.0009238249136432     0.0021843129423927     0.0002241754326548    -0.0001529202396159    -0.0006804184021987     0.0008415053078857    -0.0000047477112895
+         0.0015801477747676    -0.0011457846430694    -0.0024433301949304     0.0021843129423927    -0.0028898266587702     0.0005339202080337     0.0001111993623714     0.0002649881422607     0.0000757092242443    -0.0012679951233439
+        -0.0006395095184393    -0.0001636547429671    -0.0007956274962875     0.0002241754326548     0.0005339202080337    -0.0143785974952049    -0.0095204344810432     0.0000200955732530     0.0004751369146538    -0.0003050686931369
+        -0.0021949204282781     0.0005204896283825    -0.0005267859366097    -0.0001529202396159     0.0001111993623714    -0.0095204344810432    -0.0118104291186434     0.0007753048217332     0.0003973227981271    -0.0000115215380989
+        -0.0056565395854700    -0.0218537280815948     0.0010909080264402    -0.0006804184021987     0.0002649881422607     0.0000200955732530     0.0007753048217332     0.0059270993084938    -0.0102941873391865     0.0007050583494903
+         0.0329183463761705     0.0102941873391865     0.0034920572385358     0.0006893817306400     0.0004448628270349     0.0001157278223723    -0.0014903138313599    -0.0026919112614725     0.0128085854087069     0.0009168262041183
+         0.0034920572385358    -0.0120472823751378     0.0277526809941542    -0.0000047477112895    -0.0012679951233439    -0.0003050686931369    -0.0000115215380989     0.0007050583494903    -0.0114969619095509     0.0004856407041217
+         0.0004583750744133    -0.0003522547843766    -0.0002237219498036    -0.0173649251222591    -0.0022959194507257     0.0020200531881526     0.0005282630018058     0.0002911491438863     0.0013640867084128    -0.0013440401556083
+        -0.0004492229037438    -0.0000317167291753     0.0008525404782215    -0.0022959194507257     0.0034882744148282     0.0011099605094439     0.0001703817549583     0.0008988134048218     0.0013997597144717     0.0014944385880088
+         0.0005519730901645    -0.0001510271615951     0.0004195714907169     0.0020200531881526     0.0011099605094439    -0.0191732502233384     0.0340338953097298    -0.0005544785311603     0.0003299194995199     0.0009309727442424
+         0.0003100129743642    -0.0006470035774063    -0.0000997802824742     0.0005282630018058     0.0001703817549583     0.0340338953097298    -0.0277385412853691    -0.0008668911604131    -0.0016688822106802     0.0001507588966625
+        -0.0014951694569210    -0.0010909080264402     0.0059791943817840     0.0002911491438863     0.0008988134048218    -0.0005544785311603    -0.0008668911604131    -0.0139128163694905     0.0034920572385358     0.0033313125278589
+        -0.0134387016615483     0.0007050583494903    -0.0033313125278589    -0.0012136747331268    -0.0016093997458248     0.0021487474635167     0.0006444871437305     0.0035299123092932    -0.0009168262041183    -0.0233410926739323
+         0.0007050583494903    -0.0039186736441384     0.0012008757602207     0.0013640867084128     0.0013997597144717     0.0003299194995199    -0.0016688822106802     0.0034920572385358     0.0024742761721566     0.0067016305597277
+
+         0.0032073510873842     0.0012400280630591    -0.0003488481070478    -0.0003936505216251    -0.0009304615390300     0.0003063754525252     0.0004477856966785     0.0014018170120726     0.0013078145384797     0.0002009753887385
+        -0.0013419833986000    -0.0055198425202958     0.0003547569522288     0.0000792030523303     0.0010291436753520    -0.0007006636139039     0.0011322107122810     0.0018016409330470    -0.0041064601154127    -0.0009496716475220
+        -0.0002126271949777     0.0001116767320023     0.0048102743549506    -0.0024650798238191    -0.0009811544682546     0.0005831194399916    -0.0005560462007014     0.0003896760503647     0.0002055224097577     0.0042739462683598
+        -0.0001397342577994    -0.0000887382250933    -0.0078314089262978     0.0083253293811272     0.0008104455987589    -0.0005621923875439     0.0004062099112327     0.0003255618781696    -0.0001349694711776    -0.0023751506345056
+        -0.0012246458163255     0.0002581642370727    -0.0002084937923348     0.0007904454971224     0.0307046028703765    -0.0056565395854700     0.0010909080264402     0.0001332231262719    -0.0000987555603829    -0.0003622078779933
+         0.0006893817306400     0.0004448628270349     0.0001157278223723    -0.0014903138313599    -0.0026919112614725     0.0038411853882602     0.0009168262041183    -0.0012136747331268    -0.0016093997458248     0.0021487474635167
+        -0.0037318297284517    -0.0050902782421755    -0.0107963072298604     0.0096668712224446    -0.0284444330902328     0.0006437435200379    -0.0119825193983360    -0.0010435577505586    -0.0000478942975274    -0.0002840330107916
+        -0.0011694157266112     0.0016833087083127     0.0008175493774043     0.0006843677720252     0.0012008757602207    -0.0067016305597277    -0.0134551187035507    -0.0000323696399393     0.0072175164227422     0.0050047555868243
+         0.0012400280630591     0.0036216244568656    -0.0004842238196106     0.0000431178460210    -0.0001399930368415    -0.0004313717873216     0.0008529848013036     0.0013078145384797     0.0009837663045315     0.0002106754830618
+        -0.0003488481070478    -0.0004842238196106     0.0028616534640052    -0.0029492509788060     0.0000560643174712    -0.0004182475830022    -0.0001116196754281     0.0002009753887385     0.0002106754830618     0.0013875497248185
+        -0.0003936505216251     0.0000431178460210    -0.0029492509788060     0.0036115594101669     0.0000580190641313     0.0006241856195955     0.0003162199022057     0.0009815070120140     0.0007571848379388    -0.0024639009000980
+        -0.0009304615390300    -0.0001399930368415     0.0000560643174712     0.0000580190641313    -0.0023752489484722    -0.0007811510511717     0.0003522547843766     0.0006798954439374     0.0006146097644712     0.0004223657456320
+         0.0003063754525252    -0.0004313717873216    -0.0004182475830022     0.0006241856195955    -0.0007811510511717     0.0014252539344529     0.0013640867084128     0.0008439870377019     0.0009873096200806    -0.0006213479862998
+        -0.0033929522268926    -0.0006880143751595    -0.0000161280144041     0.0001076330322435     0.0000374496247091    -0.0008415053078857     0.0010435577505586    -0.0004477856966785    -0.0006057268743922     0.0005990964934623
+         0.0004477856966785     0.0008529848013036    -0.0001116196754281     0.0003162199022057     0.0003522547843766     0.0013640867084128    -0.0000621910208180     0.0033235843121336     0.0000605714040946     0.0002563852686107
+        -0.0133707243891015    -0.0013419833986000     0.0006233604116188     0.0003830732896112     0.0001169980866690     0.0001886644862700    -0.0006057268743922     0.0259263456314349     0.0018016409330470    -0.0005970231891259
+         0.0006233604116188     0.0003547569522288    -0.0141470925594981     0.0035258185574029    -0.0000587675277547     0.0004306702102859    -0.0000861300960987    -0.0005970231891259    -0.0009496716475220     0.0201948179388331
+         0.0003830732896112     0.0000792030523303     0.0035258185574029    -0.0149788610444675    -0.0001851844573276    -0.0001498172479063    -0.0003261163949170    -0.0017100795030433    -0.0010236364829457    -0.0032286553626393
+         0.0001169980866690     0.0010291436753520    -0.0000587675277547    -0.0001851844573276    -0.0121109751802915     0.0003917628770900    -0.0000317167291753    -0.0009685682842788     0.0003407043442677     0.0006766279729867
+         0.0001886644862700    -0.0007006636139039     0.0004306702102859    -0.0001498172479063     0.0003917628770900    -0.0133384355315758    -0.0013997597144717    -0.0013328266394818     0.0023495762333201    -0.0003840262105788
+         0.0006880143751595     0.0024474860447547    -0.0001357743591343    -0.0002482671181660     0.0011457846430694     0.0000757092242443    -0.0000478942975274     0.0008529848013036    -0.0011322107122810     0.0005952950256577
+        -0.0006057268743922     0.0011322107122810    -0.0000861300960987    -0.0003261163949170    -0.0000317167291753    -0.0013997597144717    -0.0119372094650806    -0.0000605714040946    -0.0056846157378175     0.0002167825777419
+         0.0019177165239071    -0.0003911110421036    -0.0002126271949777     0.0000719763547908     0.0002408064668346     0.0003008069867104    -0.0005990964934623     0.0021846251895294     0.0001399500838268     0.0003896760503647
+        -0.0003911110421036     0.0033271195853956     0.0001116767320023    -0.0002383946997713    -0.0003225477480982    -0.0003375143453232     0.0005952950256577     0.0001399500838268     0.0026498327312777     0.0002055224097577
+         0.0000719763547908    -0.0002383946997713    -0.0024650798238191     0.0055773679185129    -0.0007310506403026    -0.0000883293475083    -0.0007509077089406    -0.0001296134057698    -0.0000259743497158     0.0066223442612590
+         0.0002408064668346    -0.0003225477480982    -0.0009811544682546    -0.0007310506403026     0.0013011022156966     0.0000834722858044     0.0001510271615951    -0.0000739240356612    -0.0000139991724501     0.0003920073716775
+         0.0003008069867104    -0.0003375143453232     0.0005831194399916    -0.0000883293475083     0.0000834722858044     0.0013964306492418     0.0003299194995199    -0.0004593449937413    -0.0001259242026446     0.0002137876544272
+        -0.0000161280144041     0.0001357743591343    -0.0017533167241978    -0.0008305286025775    -0.0001636547429671    -0.0004751369146538     0.0002840330107916     0.0001116196754281    -0.0000861300960987     0.0005560462007014
+        -0.0005990964934623     0.0005952950256577    -0.0005560462007014    -0.0007509077089406     0.0001510271615951     0.0003299194995199     0.0008299265062053     0.0002563852686107    -0.0002167825777419     0.0008121343882754
+         0.0065121257991484     0.0008347566517066     0.0000380353829001    -0.0001397342577994    -0.0001652749854497    -0.0001387639909931     0.0003949396763810    -0.0029301507641298    -0.0002227219903882    -0.0000811928300619
+         0.0008347566517066     0.0031521869920488     0.0001957568488166    -0.0000887382250933    -0.0001239444487830     0.0004018540129850    -0.0009991300709510    -0.0002227219903882    -0.0020465055317322     0.0001592472039696
+         0.0000380353829001     0.0001957568488166     0.0063810924173302    -0.0078314089262978     0.0008346357708956    -0.0002412654876314     0.0005616852861621    -0.0000811928300619     0.0001592472039696    -0.0060984943775261
+        -0.0001652749854497    -0.0001239444487830     0.0008346357708956     0.0008104455987589     0.0058658244031894     0.0002314071875919    -0.0006470035774063     0.0002704202119273    -0.0000112553487054    -0.0004013609368741
+        -0.0001387639909931     0.0004018540129850    -0.0002412654876314    -0.0005621923875439     0.0002314071875919     0.0064392407775809     0.0016688822106802     0.0005675430414954     0.0000263602621206     0.0003414312821772
+        -0.0001076330322435    -0.0002482671181660     0.0008305286025775     0.0017301585510884    -0.0005204896283825     0.0003973227981271    -0.0012484457125895     0.0003162199022057     0.0003261163949170    -0.0007509077089406
+         0.0003949396763810    -0.0009991300709510     0.0005616852861621     0.0004062099112327    -0.0006470035774063     0.0016688822106802     0.0060589452798321    -0.0004476891020384     0.0001133267885034    -0.0003111900149557
+         0.0206876641399491     0.0044029008677081    -0.0011590571073567     0.0000601598559675    -0.0012246458163255     0.0019239919915787     0.0006003878532383    -0.0081721604120321     0.0012942316569209     0.0002099286519390
+         0.0044029008677081     0.0058854647486669    -0.0000151749658835    -0.0001129903117861     0.0002581642370727     0.0015801477747676    -0.0024433301949304     0.0012942316569209    -0.0070802074242740    -0.0000694504600011
+        -0.0011590571073567    -0.0000151749658835    -0.0026290846250801    -0.0309758949686719    -0.0002084937923348    -0.0006395095184393    -0.0007956274962875     0.0002099286519390    -0.0000694504600011    -0.0052496783693016
+         0.0000601598559675    -0.0001129903117861    -0.0309758949686719     0.0054230352358149     0.0007904454971224    -0.0021949204282781    -0.0005267859366097     0.0002869589568788     0.0000245747622370     0.0085492035126860
+         0.0019239919915787     0.0015801477747676    -0.0006395095184393    -0.0021949204282781    -0.0056565395854700     0.0329183463761705     0.0034920572385358     0.0004583750744133    -0.0004492229037438     0.0005519730901645
+         0.0000374496247091    -0.0011457846430694    -0.0001636547429671     0.0005204896283825    -0.0218537280815948     0.0102941873391865    -0.0120472823751378    -0.0003522547843766    -0.0000317167291753    -0.0001510271615951
+         0.0006003878532383    -0.0024433301949304    -0.0007956274962875    -0.0005267859366097     0.0010909080264402     0.0034920572385358     0.0277526809941542    -0.0002237219498036     0.0008525404782215     0.0004195714907169
+         0.0009238249136432     0.0021843129423927     0.0002241754326548    -0.0001529202396159    -0.0006804184021987     0.0006893817306400    -0.0000047477112895    -0.0173649251222591    -0.0022959194507257     0.0020200531881526
+         0.0021843129423927    -0.0028898266587702     0.0005339202080337     0.0001111993623714     0.0002649881422607     0.0004448628270349    -0.0012679951233439    -0.0022959194507257     0.0034882744148282     0.0011099605094439
+         0.0002241754326548     0.0005339202080337    -0.0143785974952049    -0.0095204344810432     0.0000200955732530     0.0001157278223723    -0.0003050686931369     0.0020200531881526     0.0011099605094439    -0.0191732502233384
+        -0.0001529202396159     0.0001111993623714    -0.0095204344810432    -0.0118104291186434     0.0007753048217332    -0.0014903138313599    -0.0000115215380989     0.0005282630018058     0.0001703817549583     0.0340338953097298
+        -0.0006804184021987     0.0002649881422607     0.0000200955732530     0.0007753048217332     0.0059270993084938    -0.0026919112614725     0.0007050583494903     0.0002911491438863     0.0008988134048218    -0.0005544785311603
+         0.0008415053078857     0.0000757092242443     0.0004751369146538     0.0003973227981271    -0.0102941873391865     0.0128085854087069    -0.0114969619095509     0.0013640867084128     0.0013997597144717     0.0003299194995199
+        -0.0000047477112895    -0.0012679951233439    -0.0003050686931369    -0.0000115215380989     0.0007050583494903     0.0009168262041183     0.0004856407041217    -0.0013440401556083     0.0014944385880088     0.0009309727442424
+        -4.1774362880599538     0.0016881166605183    -0.0122964417593780    -0.0079777111582026    -0.0003168673946842    -0.0008745951679577     0.0008728088297583    -0.0060326232919674    -0.0036728450005627     0.0007567948127510
+         0.0016881166605183    -4.1893844519892882     0.0006865220058371    -0.0000543894419439    -0.0071875653618501     0.0008573290456425     0.0059327407995263    -0.0036728450005627     0.0012293724733657    -0.0006369725615989
+        -0.0122964417593780     0.0006865220058371    -3.6562637037306143    -0.0800043544116686    -0.0083164100474219     0.0023361496724349     0.0039480439397106     0.0007567948127510    -0.0006369725615989     0.0138636487862305
+        -0.0079777111582026    -0.0000543894419439    -0.0800043544116686    -3.6314102937875070     0.0078519299083449     0.0118775448645283     0.0113959842902135    -0.0014947087588726    -0.0008395159904560     0.0253350139729255
+        -0.0003168673946842    -0.0071875653618501    -0.0083164100474219     0.0078519299083449    -3.7029402480767240    -0.0038786700021836    -0.0076502872348573    -0.0007608035075028    -0.0004171752715067    -0.0002625402763287
+        -0.0008745951679577     0.0008573290456425     0.0023361496724349     0.0118775448645283    -0.0038786700021836    -3.6768359830538575     0.0432717664608432    -0.0025629705673762    -0.0019193198602103     0.0007464287182564
+         0.0008728088297583     0.0059327407995263     0.0039480439397106     0.0113959842902135    -0.0076502872348573     0.0432717664608432    -3.6991241617516768    -0.0011694157266112     0.0016833087083127     0.0008175493774043
+        -0.0060326232919674    -0.0036728450005627     0.0007567948127510    -0.0014947087588726    -0.0007608035075028    -0.0025629705673762    -0.0011694157266112    -4.2228590247203917     0.0006133702867352    -0.0098535199128274
+        -0.0036728450005627     0.0012293724733657    -0.0006369725615989    -0.0008395159904560    -0.0004171752715067    -0.0019193198602103     0.0016833087083127     0.0006133702867352    -4.2349074279638765     0.0011259219327978
+         0.0007567948127510    -0.0006369725615989     0.0138636487862305     0.0253350139729255    -0.0002625402763287     0.0007464287182564     0.0008175493774043    -0.0098535199128274     0.0011259219327978    -3.6933943745901319
+        -0.0014947087588726    -0.0008395159904560     0.0253350139729255     0.0073532012544908    -0.0009550292217189     0.0017985836218135     0.0006843677720252    -0.0095279213902816    -0.0006104618022851    -0.0309352003218928
+        -0.0007608035075028    -0.0004171752715067    -0.0002625402763287    -0.0009550292217189    -0.0133988466649619     0.0006897614478283     0.0012008757602207    -0.0000354183889646    -0.0062380771645452    -0.0089082165391322
+        -0.0025629705673762    -0.0019193198602103     0.0007464287182564     0.0017985836218135     0.0006897614478283    -0.0129122419152662    -0.0067016305597277    -0.0028492536295273    -0.0008840724755571     0.0048478883299940
+        -0.0010435577505586    -0.0000478942975274    -0.0002840330107916    -0.0012484457125895     0.0120472823751378    -0.0114969619095509     0.0189725612163326    -0.0023957578946278    -0.0037751754056608    -0.0098375832373693
+
+         0.0009815070120140     0.0006798954439374     0.0008439870377019    -0.0004477856966785
+        -0.0010236364829457     0.0003407043442677     0.0023495762333201    -0.0011322107122810
+         0.0066223442612590     0.0003920073716775     0.0002137876544272     0.0005560462007014
+        -0.0054536179121804    -0.0003085226372640    -0.0005117900477540    -0.0004062099112327
+        -0.0001354435527023    -0.0097347277593958    -0.0014951694569210    -0.0010909080264402
+         0.0006444871437305     0.0035299123092932    -0.0362316002655150    -0.0009168262041183
+        -0.0012484457125895     0.0120472823751378    -0.0114969619095509    -0.0008985272122411
+         0.0120527292593767    -0.0001776365849400     0.0224594574056061     0.0005740720929736
+         0.0007571848379388     0.0006146097644712     0.0009873096200806    -0.0006057268743922
+        -0.0024639009000980     0.0004223657456320    -0.0006213479862998     0.0005990964934623
+         0.0018651766462542     0.0003692455181617    -0.0000104276306718     0.0003949396763810
+         0.0003692455181617     0.0004572132321840    -0.0000459950114892    -0.0006003878532383
+        -0.0000104276306718    -0.0000459950114892     0.0021936634167363    -0.0000047477112895
+         0.0003949396763810    -0.0006003878532383    -0.0000047477112895     0.0003060160576742
+         0.0004476891020384    -0.0002237219498036     0.0013440401556083    -0.0011694157266112
+        -0.0017100795030433    -0.0009685682842788    -0.0013328266394818     0.0008529848013036
+        -0.0032286553626393     0.0006766279729867    -0.0003840262105788     0.0005952950256577
+         0.0211462703386045     0.0002569391433956    -0.0004467848935185     0.0009991300709510
+         0.0002569391433956     0.0238914706955879    -0.0005542411049345    -0.0024433301949304
+        -0.0004467848935185    -0.0005542411049345     0.0241322063485019     0.0012679951233439
+         0.0009991300709510    -0.0024433301949304     0.0012679951233439     0.0224029264293815
+         0.0001133267885034    -0.0008525404782215     0.0014944385880088    -0.0016833087083127
+        -0.0001296134057698    -0.0000739240356612    -0.0004593449937413     0.0001116196754281
+        -0.0000259743497158    -0.0000139991724501    -0.0001259242026446    -0.0000861300960987
+         0.0025485318513537     0.0002380820799062    -0.0001056877621741     0.0005616852861621
+         0.0002380820799062     0.0011220816622939     0.0003853774738894     0.0007956274962875
+        -0.0001056877621741     0.0003853774738894    -0.0003115555610629    -0.0003050686931369
+         0.0005616852861621     0.0007956274962875    -0.0003050686931369     0.0019963266783840
+         0.0003111900149557     0.0004195714907169    -0.0009309727442424     0.0008175493774043
+         0.0003255618781696     0.0002704202119273     0.0005675430414954     0.0003162199022057
+        -0.0001349694711776    -0.0000112553487054     0.0000263602621206     0.0003261163949170
+        -0.0023751506345056    -0.0004013609368741     0.0003414312821772    -0.0007509077089406
+        -0.0003085226372640    -0.0007650495776636     0.0000385180526590    -0.0005267859366097
+        -0.0005117900477540     0.0000385180526590    -0.0008475468113719     0.0000115215380989
+        -0.0004062099112327    -0.0005267859366097     0.0000115215380989    -0.0012563586009136
+        -0.0009158566310066     0.0000997802824742     0.0001507588966625    -0.0006843677720252
+         0.0002869589568788     0.0001332231262719     0.0004583750744133    -0.0003522547843766
+         0.0000245747622370    -0.0000987555603829    -0.0004492229037438    -0.0000317167291753
+         0.0085492035126860    -0.0003622078779933     0.0005519730901645    -0.0001510271615951
+        -0.0074486379976136    -0.0001354435527023     0.0003100129743642    -0.0006470035774063
+         0.0003100129743642    -0.0014951694569210    -0.0134387016615483     0.0007050583494903
+        -0.0006470035774063    -0.0010909080264402     0.0007050583494903    -0.0039186736441384
+        -0.0000997802824742     0.0059791943817840    -0.0033313125278589     0.0012008757602207
+         0.0005282630018058     0.0002911491438863    -0.0012136747331268     0.0013640867084128
+         0.0001703817549583     0.0008988134048218    -0.0016093997458248     0.0013997597144717
+         0.0340338953097298    -0.0005544785311603     0.0021487474635167     0.0003299194995199
+        -0.0277385412853691    -0.0008668911604131     0.0006444871437305    -0.0016688822106802
+        -0.0008668911604131    -0.0139128163694905     0.0035299123092932     0.0034920572385358
+        -0.0016688822106802     0.0034920572385358    -0.0009168262041183     0.0024742761721566
+         0.0001507588966625     0.0033313125278589    -0.0233410926739323     0.0067016305597277
+        -0.0014947087588726    -0.0007608035075028    -0.0025629705673762    -0.0010435577505586
+        -0.0008395159904560    -0.0004171752715067    -0.0019193198602103    -0.0000478942975274
+         0.0253350139729255    -0.0002625402763287     0.0007464287182564    -0.0002840330107916
+         0.0073532012544908    -0.0009550292217189     0.0017985836218135    -0.0012484457125895
+        -0.0009550292217189    -0.0133988466649619     0.0006897614478283     0.0120472823751378
+         0.0017985836218135     0.0006897614478283    -0.0129122419152662    -0.0114969619095509
+         0.0006843677720252     0.0012008757602207    -0.0067016305597277     0.0189725612163326
+        -0.0095279213902816    -0.0000354183889646    -0.0028492536295273    -0.0023957578946278
+        -0.0006104618022851    -0.0062380771645452    -0.0008840724755571    -0.0037751754056608
+        -0.0309352003218928    -0.0089082165391322     0.0048478883299940    -0.0098375832373693
+        -3.6808396472980180     0.0073863920276617     0.0130064097473223     0.0075531496932432
+         0.0073863920276617    -3.7611380544322612    -0.0082761404216555    -0.0196644887194520
+         0.0130064097473223    -0.0082761404216555    -3.7480161437642785    -0.0000670372833109
+         0.0075531496932432    -0.0196644887194520    -0.0000670372833109    -3.7905725945199431
+
+ Eigenvalues of the D00-D00 Matrix
+  1  -461.3251023108005597
+  2  -461.3246169964825185
+  3  -461.2997919192733320
+  4  -461.2932813361005628
+  5  -461.2902937424212837
+  6  -461.2784556474808824
+  7  -461.2736829799338238
+  8  -461.2464716943516692
+  9  -460.9152994242606951
+  10  -460.9103241801445847
+  11  -460.9079493391930100
+  12  -460.9019324203927681
+  13  -460.8954459958937946
+  14  -460.8907904617782947
+  15  -460.8870187828993039
+  16  -460.8830400417176634
+  17  -460.8788932841355290
+  18  -460.8605742859153338
+  19  -460.8591321786703361
+  20  -460.8499659144735574
+  21  -460.8465517323346603
+  22  -460.8407363080112304
+  23  -460.8325368470812577
+  24  -460.8225930101066865
+  25  -460.8162777403824180
+  26  -460.8062804914792991
+  27  -460.7991135786177779
+  28  -460.7956592298953638
+  29  -460.7911106434245312
+  30  -460.7741103479875733
+  31  -460.7719064414570198
+  32  -460.7441683191156017
+  33  -460.7420003071759425
+  34  -460.7247095200704052
+  35  -460.7057326247045239
+  36  -460.7022785098923237
+  37  -460.7012311813555812
+  38  -460.6964598640126383
+  39  -460.6704642952211657
+  40  -460.6614542762332576
+  41  -460.6371426629449957
+  42  -460.6251826724280818
+  43  -460.3723908000134202
+  44  -460.3296771769486213
+  45  -460.3185069310391668
+  46  -460.3036418437623070
+  47  -460.2983925525852555
+  48  -460.2928670628094210
+  49  -460.2769432711110653
+  50  -460.2616067293308220
+  51  -460.2442230286727067
+  52  -460.2353488111942283
+  53  -460.2257699430074354
+  54  -460.2177979373803964
+  55  -460.2144434772334307
+  56  -460.2073895052986927
+  57  -460.1655719018717150
+  58  -460.1583477176789643
+  59  -460.1565153186986663
+  60  -460.1192980379976234
+  61  -460.0963225571243811
+  62  -460.0628956859059144
+  63  -460.0577855185276235
+  64  -459.9899078180073957
+ >>> H0 diagonalised in   3.0489999999998574E-003 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 9 vectors with a convergence threshold of  1.0E-08
+
+Total Elapsed tWall       2.5180s
+Particles are divided in batches of 40
+  #Iter  tallCPU (s)    tCPU0 (s)   tWall0 (s)  Energies
+      0       0.0000       0.0000       0.0000   -461.3251023108    -461.3246169965    -461.2997919193    -461.2932813361    -461.2902937424
+                                                 -461.2784556475    -461.2736829799    -461.2464716944    -460.9152994243
+      1       0.0021       0.0024       0.0010   -461.3251023108    -461.3246169965    -461.2997919193    -461.2932813361    -461.2902937424
+                                                       0.000E+00          0.000E+00         -8.882E-16         -1.776E-15
+                                                 -461.2784556475    -461.2736829799    -461.2464716944    -460.9152994243
+                                                       0.000E+00          0.000E+00          8.882E-16          0.000E+00
+      2       0.0016       0.0018       0.0000   -461.3251023108    -461.3246169965    -461.2997919193    -461.2932813361    -461.2902937424
+                                                       2.665E-15          8.882E-16          0.000E+00          0.000E+00
+                                                 -461.2784556475    -461.2736829799    -461.2464716944    -460.9152994243
+                                                       8.882E-16          2.665E-15          8.882E-16         -8.882E-16
+    
+ >>> No convergence after             2  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.444089E-15    0.172776E-14   -0.457330E-16    0.763871E-16   -0.494078E-15    0.244924E-15    0.313024E-15    0.615596E-15   -0.951559E-17
+        0.172776E-14   -0.144329E-14   -0.280507E-15    0.233856E-15    0.736173E-16    0.163302E-15   -0.287876E-15   -0.225938E-16    0.655954E-16
+       -0.457330E-16   -0.280507E-15    0.444089E-15   -0.233298E-16   -0.559553E-15   -0.307624E-15    0.545609E-15    0.208047E-15   -0.716952E-15
+        0.763871E-16    0.233856E-15   -0.233298E-16    0.666134E-15   -0.229729E-15   -0.195331E-15   -0.597824E-15   -0.111433E-14   -0.120854E-15
+       -0.494078E-15    0.736173E-16   -0.559553E-15   -0.229729E-15    0.888178E-15    0.128835E-15   -0.601193E-15   -0.329852E-15   -0.189242E-15
+        0.244924E-15    0.163302E-15   -0.307624E-15   -0.195331E-15    0.128835E-15   -0.111022E-14   -0.259833E-15   -0.540895E-15    0.232382E-15
+        0.313024E-15   -0.287876E-15    0.545609E-15   -0.597824E-15   -0.601193E-15   -0.259833E-15    0.222045E-15    0.675538E-15    0.169929E-15
+        0.615596E-15   -0.225938E-16    0.208047E-15   -0.111433E-14   -0.329852E-15   -0.540895E-15    0.675538E-15    0.444089E-15    0.958216E-16
+       -0.951559E-17    0.655954E-16   -0.716952E-15   -0.120854E-15   -0.189242E-15    0.232382E-15    0.169929E-15    0.958216E-16   -0.188738E-14
+
+ Energies :   -461.325102310800560    -461.324616996482519    -461.299791919273332    -461.293281336100563    -461.290293742421284
+ E ss ref :     -4.238928210176871      -4.238442895858859      -4.213617818649678      -4.207107235476873      -4.204119641797621
+ dE (a.u.):      0.000000000000000       0.000485314318012       0.025310391527193       0.031820974699998       0.034808568379250
+ dE (meV) :      0.000000000000000      13.206075358130308     688.730839883632257     865.892833285451843     947.189398837663930
+ |Hv-Ev|  :             6.2832E-15              6.1321E-15              6.3270E-15              5.7415E-15              3.3123E-15
+ deltaE   :             2.6645E-15              8.8818E-16              0.0000E+00              0.0000E+00              0.0000E+00
+
+ Energies :   -461.278455647480882    -461.273682979933824    -461.246471694351669    -460.915299424260695
+ E ss ref :     -4.192281546857199      -4.187508879310132      -4.160297593727995      -3.829125323637036
+ dE (a.u.):      0.046646663319672       0.051419330866739       0.078630616448876       0.409802886539835
+ dE (meV) :   1269.320372678156900    1399.191272725075805    2139.648074950512182   11151.304630356244161
+ |Hv-Ev|  :             8.0419E-15              7.1161E-15              6.8610E-15              3.7814E-15
+ deltaE   :             8.8818E-16              2.6645E-15              8.8818E-16             -8.8818E-16
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+ Calculation finished in CPUtime             3.52s Walltime:             3.53s
+ Calculation finished on 11-12-2020 at 12:20
diff --git a/test/CuO_00800_LS/test b/test/CuO_00800_LS/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_00800_LS/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_02204/INPUT b/test/CuO_02204/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..d66905e7181e956e3b256d2b88d534794166a8d8
--- /dev/null
+++ b/test/CuO_02204/INPUT
@@ -0,0 +1,42 @@
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.,
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 0, 
+   norb_ligo = 2, 
+   norb_act  = 2, 
+   norb_ligv = 0, 
+   norb_virt = 4, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=1, 
+  nelact = 2
+ &end
+
+ &davidinp
+  NiterDavidson = 50,
+  SizeheffDavidson = 5,
+  tol_conv = 1.d-16,
+ &end
+
diff --git a/test/CuO_02204/cuo.TraInt b/test/CuO_02204/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_02204/cuo.TraInt differ
diff --git a/test/CuO_02204/cuo.TraOne b/test/CuO_02204/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_02204/cuo.TraOne differ
diff --git a/test/CuO_02204/cuo.ref0 b/test/CuO_02204/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..6f920df2bbc84673d193668f4c3599958e8df70a
--- /dev/null
+++ b/test/CuO_02204/cuo.ref0
@@ -0,0 +1,3 @@
+43u 44d
+
+
diff --git a/test/CuO_02204/result/cuo.out b/test/CuO_02204/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..55394e5562b63ae6e3c504b6bcb36030b2a1dc29
--- /dev/null
+++ b/test/CuO_02204/result/cuo.out
@@ -0,0 +1,286 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 17-03-2020 at 15:48
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   2
+  Nbre d'orbitales actives         :   2
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   4
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     0     2     2     0     4    70     8   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   2
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :  50
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            0
+    Ligo   =            2
+       Molcas    :      41     42
+       Molcas/ir :      41     42
+       SelS      :      41     42
+       SelS up   :      81     82
+       SelS dn   :      83     84
+    Act    =            2
+       Molcas    :      43     44
+       Molcas/ir :      43     44
+       SelS      :      43     44
+       SelS up   :      85     86
+       SelS dn   :      87     88
+    Ligv   =            0
+    Virt   =            4
+       Molcas    :      45     46     47     48
+       Molcas/ir :      45     46     47     48
+       SelS      :      45     46     47     48
+       SelS up   :      89     90     91     92
+       SelS dn   :      93     94     95     96
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    10 01 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  2
+  Ref1 Cas  -> Cas  :    1 ->     2
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                        4
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                       80
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        8
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                       80
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                       16
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        4
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                           192
+ >>>Determinants generated in   1.0040000000000006E-003 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                6
+  (ao|oo)                               12
+  (aa|oo) and (ao|ao)                   19
+  (aa|ao)                               12
+  (aa|aa)                                6
+  (vo|oo)                               24
+  (va|oo) and (vo|ao)                   56
+  (va|ao) and (vo|aa)                   56
+  (va|aa)                               24
+  (vv|oo) and (vo|vo)                   66
+  (vv|ao), and (va|vo)                 104
+  (vv|aa) and (va|va)                   66
+  (vv|vo)                               80
+  (vv|va)                               80
+  (vv|vv)                               55
+  gelees                                 0
+ >>> Integrals read in   3.3299999999999992E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   4.4600000000000022E-004 second(s)
+
+  One-electron energy =   -5.6333251447329564     
+  Two-electron energy =    1.4293525186717915     
+  E0                  =   -4.2039726260611650     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -461.29014672668484     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000564 second(s)  Wall time:    0.000000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   8.2999999999999741E-005 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-08
+
+Total Elapsed tWall       0.0090
+s
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0076       0.0070   -462.5453135932    -462.5452409962
+      1       0.0077       0.0070   -462.5453135932    -462.5452409962
+      2       0.0051       0.0060   -462.5453402584    -462.5452716609
+      3       0.0054       0.0050   -462.5453408821    -462.5452722748
+      4       0.0039       0.0040   -462.5453410252    -462.5452723691
+      5       0.0044       0.0040   -462.5453410363    -462.5452723813
+  >>> On contracte <<<
+      6       0.0040       0.0040   -462.5453410363    -462.5452723813
+      7       0.0038       0.0040   -462.5453410367    -462.5452723821
+      8       0.0048       0.0050   -462.5453410368    -462.5452723822
+      9       0.0052       0.0060   -462.5453410368    -462.5452723822
+     10       0.0047       0.0050   -462.5453410368    -462.5452723822
+  >>> On contracte <<<
+     11       0.0076       0.0070   -462.5453410368    -462.5452723822
+     12       0.0060       0.0060   -462.5453410368    -462.5452723822
+     13       0.0078       0.0080   -462.5453410368    -462.5452723822
+     14       0.0076       0.0080   -462.5453410368    -462.5452723822
+  The vectors            1  seem congerved : we take them out
+     15       0.0049       0.0040   -462.5452723822
+     16       0.0069       0.0070   -462.5452723822
+     17       0.0066       0.0070   -462.5452723822
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   17  ncol=  4 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-16 <<<
+ >>> Convergence reached after           16  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.199840E-14    0.458638E-17
+        0.458638E-17   -0.166533E-14
+
+ Energies :   -462.545341036843922    -462.545272382244889
+ E ss ref :     -1.255194310159074      -1.255125655560057
+ dE (a.u.):      0.000000000000000       0.000068654599017
+ dE (meV) :      0.000000000000000       1.868186811425697
+ |Hv-Ev|  :             6.0306E-09              3.7839E-09
+ deltaE   :            -4.4409E-16              0.0000E+00
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.12s Walltime:             0.12s
+ Calculation finished on 17-03-2020 at 15:48
diff --git a/test/CuO_02204/test b/test/CuO_02204/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_02204/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_02240/INPUT b/test/CuO_02240/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..f87e065893d7daa932ee81f5a769f99807cde757
--- /dev/null
+++ b/test/CuO_02240/INPUT
@@ -0,0 +1,44 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.,
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 0, 
+   norb_ligo = 2, 
+   norb_act  = 2, 
+   norb_ligv = 4, 
+   norb_virt = 0, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=1, 
+  nelact = 2
+ &end
+
+ &davidinp
+  NiterDavidson = 50,
+  SizeheffDavidson = 5,
+  tol_conv = 1.d-16,
+ &end
+
diff --git a/test/CuO_02240/cuo.TraInt b/test/CuO_02240/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_02240/cuo.TraInt differ
diff --git a/test/CuO_02240/cuo.TraOne b/test/CuO_02240/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_02240/cuo.TraOne differ
diff --git a/test/CuO_02240/cuo.ref0 b/test/CuO_02240/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..6f920df2bbc84673d193668f4c3599958e8df70a
--- /dev/null
+++ b/test/CuO_02240/cuo.ref0
@@ -0,0 +1,3 @@
+43u 44d
+
+
diff --git a/test/CuO_02240/result/cuo.out b/test/CuO_02240/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..91cff1051024b7a275120f8e667108a9393e81b3
--- /dev/null
+++ b/test/CuO_02240/result/cuo.out
@@ -0,0 +1,290 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:04
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   2
+  Nbre d'orbitales actives         :   2
+  Nbre d'orbitales lig. virt       :   4
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     0     2     2     4     0    70     8   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   2
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :  50
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            0
+    Ligo   =            2
+       Molcas    :      41     42
+       Molcas/ir :      41     42
+       SelS      :      41     42
+       SelS up   :      81     82
+       SelS dn   :      83     84
+    Act    =            2
+       Molcas    :      43     44
+       Molcas/ir :      43     44
+       SelS      :      43     44
+       SelS up   :      85     86
+       SelS dn   :      87     88
+    Ligv   =            4
+       Molcas    :      45     46     47     48
+       Molcas/ir :      45     46     47     48
+       SelS      :      45     46     47     48
+       SelS up   :      89     90     91     92
+       SelS dn   :      93     94     95     96
+    Virt   =            0
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    10 01 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  2
+  Nbre de det Ref1 ligo-> ligv + ech :   48
+  Ref1 Cas  -> Cas  :    1 ->     2
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                        4
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                       80
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                      384
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        8
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                       80
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                       16
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                      176
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        4
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                       16
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                           768
+ >>>Determinants generated in   8.0000000000000002E-003 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                6
+  (ao|oo)                               12
+  (aa|oo) and (ao|ao)                   19
+  (aa|ao)                               12
+  (aa|aa)                                6
+  (vo|oo)                               24
+  (va|oo) and (vo|ao)                   56
+  (va|ao) and (vo|aa)                   56
+  (va|aa)                               24
+  (vv|oo) and (vo|vo)                   66
+  (vv|ao), and (va|vo)                 104
+  (vv|aa) and (va|va)                   66
+  (vv|vo)                               80
+  (vv|va)                               80
+  (vv|vv)                               55
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000001E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -5.6333251447329564     
+  Two-electron energy =    1.4293525186717915     
+  E0                  =   -4.2039726260611650     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -461.29014672668484     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000000 second(s)  Wall time:    0.002000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-08
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5453135932    -462.5452409962
+      1       0.0600       0.0640   -462.5453135932    -462.5452409962
+      2       0.0440       0.0470   -462.5454817142    -462.5454123933
+      3       0.0360       0.0420   -462.5454859356    -462.5454171602
+      4       0.0320       0.0360   -462.5454861845    -462.5454173482
+      5       0.0320       0.0340   -462.5454862280    -462.5454173862
+  >>> On contracte <<<
+      6       0.0280       0.0340   -462.5454862280    -462.5454173862
+      7       0.0280       0.0330   -462.5454862312    -462.5454173904
+      8       0.0320       0.0330   -462.5454862316    -462.5454173914
+      9       0.0280       0.0330   -462.5454862317    -462.5454173916
+     10       0.0280       0.0330   -462.5454862317    -462.5454173916
+  >>> On contracte <<<
+     11       0.0280       0.0330   -462.5454862317    -462.5454173916
+     12       0.0280       0.0340   -462.5454862317    -462.5454173916
+     13       0.0280       0.0330   -462.5454862317    -462.5454173916
+     14       0.0320       0.0330   -462.5454862317    -462.5454173916
+     15       0.0280       0.0340   -462.5454862317    -462.5454173916
+  >>> On contracte <<<
+     16       0.0320       0.0350   -462.5454862317    -462.5454173916
+     17       0.0280       0.0350   -462.5454862317    -462.5454173916
+  The vectors            1  seem congerved : we take them out
+     18       0.0320       0.0340   -462.5454173916
+     19       0.0280       0.0330   -462.5454173916
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   19  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-16 <<<
+ >>> Convergence reached after           18  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.133227E-14   -0.281094E-16
+       -0.281094E-16    0.888178E-15
+
+ Energies :   -462.545486231704047    -462.545417391615047
+ E ss ref :     -1.255339505019207      -1.255270664930223
+ dE (a.u.):      0.000000000000000       0.000068840088984
+ dE (meV) :      0.000000000000000       1.873234250560906
+ |Hv-Ev|  :             4.0587E-09              5.2934E-09
+ deltaE   :             0.0000E+00              0.0000E+00
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.66s Walltime:             0.87s
+ Calculation finished on 04-09-2019 at 15:04
diff --git a/test/CuO_02240/test b/test/CuO_02240/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_02240/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450/INPUT b/test/CuO_03450/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..815f4354b6534c989a1e9fd9f5cd5af290d9cf9e
--- /dev/null
+++ b/test/CuO_03450/INPUT
@@ -0,0 +1,42 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ debug_dav = .true.
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_03450/cuo.TraInt b/test/CuO_03450/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450/cuo.TraInt differ
diff --git a/test/CuO_03450/cuo.TraOne b/test/CuO_03450/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450/cuo.TraOne differ
diff --git a/test/CuO_03450/cuo.ref0 b/test/CuO_03450/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450/result/cuo.out b/test/CuO_03450/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..43540733309475dd07fd7d8afeb47dcae4aead90
--- /dev/null
+++ b/test/CuO_03450/result/cuo.out
@@ -0,0 +1,294 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:09
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :  480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in  0.17599999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000036E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.020000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       2.4760       2.5690   -462.5452856260    -462.5452132936
+      2       2.1960       2.2140   -462.5473438544    -462.5472729767
+      3       2.2160       2.2240   -462.5473910781    -462.5473230881
+      4       2.3720       2.3810   -462.5473944973    -462.5473266520
+      5       2.2000       2.2080   -462.5473949684    -462.5473271286
+      6       2.2360       2.2470   -462.5473950180    -462.5473271905
+      7       2.2320       2.2420   -462.5473950222    -462.5473271979
+      8       2.2400       2.2490   -462.5473950228    -462.5473271988
+  The vectors            1  seem congerved : we take them out
+      9       2.2000       2.2110   -462.5473271988
+     10       2.1680       2.1780   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.188738E-14    0.126768E-15
+        0.126768E-15   -0.655032E-14
+
+ Energies :   -462.547395022798923    -462.547327198962932
+ E ss ref :     -3.037527684853703      -3.037459861017721
+ dE (a.u.):      0.000000000000000       0.000067823835982
+ dE (meV) :      0.000000000000000       1.845580597594530
+ |Hv-Ev|  :             9.1813E-06              5.3980E-06
+ deltaE   :            -5.7348E-10             -1.1886E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            25.36s Walltime:            26.04s
+ Calculation finished on 04-09-2019 at 15:09
diff --git a/test/CuO_03450/test b/test/CuO_03450/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_03450/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_allcontraction/INPUT b/test/CuO_03450_allcontraction/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..ee9a0feca1c4dfd1bf96c1b0d6731607be892819
--- /dev/null
+++ b/test/CuO_03450_allcontraction/INPUT
@@ -0,0 +1,41 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 2,
+ tol_conv = 1.d-20,
+ &end
+
diff --git a/test/CuO_03450_allcontraction/cuo.TraInt b/test/CuO_03450_allcontraction/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_allcontraction/cuo.TraInt differ
diff --git a/test/CuO_03450_allcontraction/cuo.TraOne b/test/CuO_03450_allcontraction/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_allcontraction/cuo.TraOne differ
diff --git a/test/CuO_03450_allcontraction/cuo.ref0 b/test/CuO_03450_allcontraction/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_allcontraction/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_allcontraction/result/cuo.out b/test/CuO_03450_allcontraction/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..eb4db87fddf64d0283406599aa46acdeaa73dc97
--- /dev/null
+++ b/test/CuO_03450_allcontraction/result/cuo.out
@@ -0,0 +1,848 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ DEBUG VersionT
+ MPI version - running on 1 CPUs
+ OMP version - running on 8 threads
+ Calculation started on 30-11-2020 at 14:52
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999995E-021
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :   2
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-20
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-20
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Ref0:     1  Couches fermees :   0 - 0000 0000  Ref0:     1  Couches ouvertes:   4 - 1111 0000
+  Ref0:     2  Couches fermees :   1 - 1000 0000  Ref0:     2  Couches ouvertes:   2 - 0110 0000
+  Ref0:     3  Couches fermees :   1 - 0100 0000  Ref0:     3  Couches ouvertes:   2 - 1010 0000
+  Ref0:     4  Couches fermees :   1 - 0010 0000  Ref0:     4  Couches ouvertes:   2 - 1100 0000
+  Ref0:     5  Couches fermees :   1 - 1000 0000  Ref0:     5  Couches ouvertes:   2 - 0101 0000
+  Ref0:     6  Couches fermees :   1 - 0100 0000  Ref0:     6  Couches ouvertes:   2 - 1001 0000
+  Ref0:     7  Couches fermees :   1 - 0001 0000  Ref0:     7  Couches ouvertes:   2 - 1100 0000
+  Ref0:     8  Couches fermees :   1 - 1000 0000  Ref0:     8  Couches ouvertes:   2 - 0011 0000
+  Ref0:     9  Couches fermees :   1 - 0001 0000  Ref0:     9  Couches ouvertes:   2 - 1010 0000
+  Ref0:    10  Couches fermees :   1 - 0010 0000  Ref0:    10  Couches ouvertes:   2 - 1001 0000
+  Ref0:    11  Couches fermees :   1 - 0001 0000  Ref0:    11  Couches ouvertes:   2 - 0110 0000
+  Ref0:    12  Couches fermees :   1 - 0100 0000  Ref0:    12  Couches ouvertes:   2 - 0011 0000
+  Ref0:    13  Couches fermees :   1 - 0010 0000  Ref0:    13  Couches ouvertes:   2 - 0101 0000
+  Ref0:    14  Couches fermees :   2 - 1100 0000  Ref0:    14  Couches ouvertes:   0 - 0000 0000
+  Ref0:    15  Couches fermees :   2 - 1010 0000  Ref0:    15  Couches ouvertes:   0 - 0000 0000
+  Ref0:    16  Couches fermees :   2 - 1001 0000  Ref0:    16  Couches ouvertes:   0 - 0000 0000
+  Ref0:    17  Couches fermees :   2 - 0110 0000  Ref0:    17  Couches ouvertes:   0 - 0000 0000
+  Ref0:    18  Couches fermees :   2 - 0101 0000  Ref0:    18  Couches ouvertes:   0 - 0000 0000
+  Ref0:    19  Couches fermees :   2 - 0011 0000  Ref0:    19  Couches ouvertes:   0 - 0000 0000
+
+  Nbre de conf d'espace unique : 19
+  Ref0 irr:     1  Couches fermees :   0 - 0000  Ref0 irr:     1  Couches ouvertes:   4 - 1111
+  Ref0 irr:     2  Couches fermees :   1 - 1000  Ref0 irr:     2  Couches ouvertes:   2 - 0110
+  Ref0 irr:     3  Couches fermees :   1 - 0100  Ref0 irr:     3  Couches ouvertes:   2 - 1010
+  Ref0 irr:     4  Couches fermees :   1 - 0010  Ref0 irr:     4  Couches ouvertes:   2 - 1100
+  Ref0 irr:     5  Couches fermees :   1 - 1000  Ref0 irr:     5  Couches ouvertes:   2 - 0101
+  Ref0 irr:     6  Couches fermees :   1 - 0100  Ref0 irr:     6  Couches ouvertes:   2 - 1001
+  Ref0 irr:     7  Couches fermees :   1 - 0001  Ref0 irr:     7  Couches ouvertes:   2 - 1100
+  Ref0 irr:     8  Couches fermees :   1 - 1000  Ref0 irr:     8  Couches ouvertes:   2 - 0011
+  Ref0 irr:     9  Couches fermees :   1 - 0001  Ref0 irr:     9  Couches ouvertes:   2 - 1010
+  Ref0 irr:    10  Couches fermees :   1 - 0010  Ref0 irr:    10  Couches ouvertes:   2 - 1001
+  Ref0 irr:    11  Couches fermees :   1 - 0001  Ref0 irr:    11  Couches ouvertes:   2 - 0110
+  Ref0 irr:    12  Couches fermees :   1 - 0100  Ref0 irr:    12  Couches ouvertes:   2 - 0011
+  Ref0 irr:    13  Couches fermees :   1 - 0010  Ref0 irr:    13  Couches ouvertes:   2 - 0101
+  Ref0 irr:    14  Couches fermees :   2 - 1100  Ref0 irr:    14  Couches ouvertes:   0 - 0000
+  Ref0 irr:    15  Couches fermees :   2 - 1010  Ref0 irr:    15  Couches ouvertes:   0 - 0000
+  Ref0 irr:    16  Couches fermees :   2 - 1001  Ref0 irr:    16  Couches ouvertes:   0 - 0000
+  Ref0 irr:    17  Couches fermees :   2 - 0110  Ref0 irr:    17  Couches ouvertes:   0 - 0000
+  Ref0 irr:    18  Couches fermees :   2 - 0101  Ref0 irr:    18  Couches ouvertes:   0 - 0000
+  Ref0 irr:    19  Couches fermees :   2 - 0011  Ref0 irr:    19  Couches ouvertes:   0 - 0000
+  Nbre de det Ref0 final : 36
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0011 1100
+0101 1010
+0110 1001
+1001 0110
+1010 0101
+1100 0011
+ Matrix to be diagonalised
+         2.000000     1.000000     1.000000     1.000000     1.000000     0.000000
+         1.000000     2.000000     1.000000     1.000000     0.000000     1.000000
+         1.000000     1.000000     2.000000     0.000000     1.000000     1.000000
+         1.000000     1.000000     0.000000     2.000000     1.000000     1.000000
+         1.000000     0.000000     1.000000     1.000000     2.000000     1.000000
+         0.000000     1.000000     1.000000     1.000000     1.000000     2.000000
+    Valeurs pp de S2
+   0.000000000000   0.000000000000   2.000000000000   2.000000000000   2.000000000000   6.000000000000
+
+    Nbre de conf S, Sz            2
+   -0.000000    0.577350
+   -0.500000   -0.288675
+    0.500000   -0.288675
+    0.500000   -0.288675
+   -0.500000   -0.288675
+    0.000000    0.577350
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+  Ref0 finaux 
+    1   :   0011 1100
+    2   :   0101 1010
+    3   :   0110 1001
+    4   :   1001 0110
+    5   :   1010 0101
+    6   :   1100 0011
+    7   :   1010 1100
+    8   :   1100 1010
+    9   :   0110 1100
+   10   :   1100 0110
+   11   :   0110 1010
+   12   :   1010 0110
+   13   :   1001 1100
+   14   :   1100 1001
+   15   :   0101 1100
+   16   :   1100 0101
+   17   :   0101 1001
+   18   :   1001 0101
+   19   :   1001 1010
+   20   :   1010 1001
+   21   :   0011 1001
+   22   :   1001 0011
+   23   :   0011 1010
+   24   :   1010 0011
+   25   :   0011 0101
+   26   :   0101 0011
+   27   :   0101 0110
+   28   :   0110 0101
+   29   :   0011 0110
+   30   :   0110 0011
+   31   :   1100 1100
+   32   :   1010 1010
+   33   :   1001 1001
+   34   :   0110 0110
+   35   :   0101 0101
+   36   :   0011 0011
+  Nbre de det Ref1 (debug) :   11160
+  Nbre de det Ref1 CAS -> CAS :       0
+  Nbre de det Ref1 ligo-> CAS :     144
+  Nbre de det Ref1 CAS -> ligv:     240
+  Nbre de det Ref1 ligo-> ligv:    1080
+  Nbre de det Ref1 ligo-> ligv + ech :     480
+  Nbre de det Ref1 ligo-> ligv tot:    1560
+  Ref1 Cas  -> Cas  :    1 ->     0
+===
+Active determinant list R_-2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+===
+Active determinant list R_-1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_0
+Contains 70 determinants
+           0           2          -2           4          -4
+          36          16          16           1           1
+===
+Active determinant list R_1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+  >>> Generation of D0
+ Estimated nb of det. 70
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+ Estimated nb of det. 4200
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+ Estimated nb of det. 252000
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+ Estimated nb of det. 336
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+ Estimated nb of det. 20160
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+ Estimated nb of det. 560
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+ Estimated nb of det. 33600
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+ Estimated nb of det. 1008
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+ Estimated nb of det. 2800
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in   5.7830000000000006E-002 second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  BSLbl = 
+    Irrep =  1
+         1  CU01  1s  
+         2  CU01  2px 
+         3  CU01  2px 
+         4  CU01  2py 
+         5  CU01  2py 
+         6  CU01  2pz 
+         7  CU01  2pz 
+         8  CU01  3d2-
+         9  CU01  3d2-
+        10  CU01  3d1-
+        11  CU01  3d1-
+        12  CU01  3d0 
+        13  CU01  3d0 
+        14  CU01  3d1+
+        15  CU01  3d1+
+        16  CU01  3d2+
+        17  CU01  3d2+
+        18  CU02  1s  
+        19  CU02  2px 
+        20  CU02  2px 
+        21  CU02  2py 
+        22  CU02  2py 
+        23  CU02  2pz 
+        24  CU02  2pz 
+        25  CU02  3d2-
+        26  CU02  3d2-
+        27  CU02  3d1-
+        28  CU02  3d1-
+        29  CU02  3d0 
+        30  CU02  3d0 
+        31  CU02  3d1+
+        32  CU02  3d1+
+        33  CU02  3d2+
+        34  CU02  3d2+
+        35  O_03  1s  
+        36  O_03  2px 
+        37  O_03  2px 
+        38  O_03  2py 
+        39  O_03  2py 
+        40  O_03  2pz 
+        41  O_03  2pz 
+        42  O_03  3d2-
+        43  O_03  3d1-
+        44  O_03  3d0 
+        45  O_03  3d1+
+        46  O_03  3d2+
+        47  O_04  1s  
+        48  O_04  2px 
+        49  O_04  2px 
+        50  O_04  2py 
+        51  O_04  2py 
+        52  O_04  2pz 
+        53  O_04  2pz 
+        54  O_04  3d2-
+        55  O_04  3d1-
+        56  O_04  3d0 
+        57  O_04  3d1+
+        58  O_04  3d2+
+        59  O_05  1s  
+        60  O_05  2px 
+        61  O_05  2px 
+        62  O_05  2py 
+        63  O_05  2py 
+        64  O_05  2pz 
+        65  O_05  2pz 
+        66  O_05  3d2-
+        67  O_05  3d1-
+        68  O_05  3d0 
+        69  O_05  3d1+
+        70  O_05  3d2+
+        71  O_06  1s  
+        72  O_06  2px 
+        73  O_06  2px 
+        74  O_06  2py 
+        75  O_06  2py 
+        76  O_06  2pz 
+        77  O_06  2pz 
+        78  O_06  3d2-
+        79  O_06  3d1-
+        80  O_06  3d0 
+        81  O_06  3d1+
+        82  O_06  3d2+
+        83  O_07  1s  
+        84  O_07  2px 
+        85  O_07  2px 
+        86  O_07  2py 
+        87  O_07  2py 
+        88  O_07  2pz 
+        89  O_07  2pz 
+        90  O_07  3d2-
+        91  O_07  3d1-
+        92  O_07  3d0 
+        93  O_07  3d1+
+        94  O_07  3d2+
+        95  O_08  1s  
+        96  O_08  2px 
+        97  O_08  2px 
+        98  O_08  2py 
+        99  O_08  2py 
+       100  O_08  2pz 
+       101  O_08  2pz 
+       102  O_08  3d2-
+       103  O_08  3d1-
+       104  O_08  3d0 
+       105  O_08  3d1+
+       106  O_08  3d2+
+       107  O_09  1s  
+       108  O_09  2px 
+       109  O_09  2px 
+       110  O_09  2py 
+       111  O_09  2py 
+       112  O_09  2pz 
+       113  O_09  2pz 
+       114  O_09  3d2-
+       115  O_09  3d1-
+       116  O_09  3d0 
+       117  O_09  3d1+
+       118  O_09  3d2+
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.3620000000000048E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   7.9400000000001691E-004 second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.051521 second(s)  Wall time:    0.016000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   5.6000000000000494E-004 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-10
+
+Total Elapsed tWall       0.0870s
+Particles are divided in batches of 40
+  #Iter  tallCPU (s)    tCPU0 (s)   tWall0 (s)  Energies
+      0       0.0000       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.0357       0.0388       0.0190   -462.5452856260    -462.5452132936
+      2       1.9904       2.0038       0.6110   -462.5473438544    -462.5472729767
+  >>> On contracte <<<
+      3       1.7898       1.8022       0.5420   -462.5473438544    -462.5472729767
+      4       1.7789       1.7916       0.5450   -462.5473900213    -462.5473219006
+  >>> On contracte <<<
+      5       1.7705       1.7830       0.5420   -462.5473900213    -462.5473219006
+      6       1.7678       1.7809       0.5390   -462.5473940676    -462.5473261975
+  >>> On contracte <<<
+      7       1.7800       1.7927       0.5390   -462.5473940676    -462.5473261975
+      8       1.7719       1.7851       0.5450   -462.5473947781    -462.5473269293
+  >>> On contracte <<<
+      9       1.7775       1.7899       0.5390   -462.5473947781    -462.5473269293
+     10       1.8227       1.8359       0.5510   -462.5473949529    -462.5473271116
+  >>> On contracte <<<
+     11       1.7653       1.7780       0.5400   -462.5473949529    -462.5473271116
+     12       1.7808       1.7936       0.5440   -462.5473950022    -462.5473271694
+  >>> On contracte <<<
+     13       1.7700       1.7820       0.5380   -462.5473950022    -462.5473271694
+     14       1.8578       1.8709       0.5590   -462.5473950166    -462.5473271886
+  >>> On contracte <<<
+     15       1.8000       1.8111       0.5500   -462.5473950166    -462.5473271886
+     16       1.7707       1.7835       0.5420   -462.5473950210    -462.5473271953
+  >>> On contracte <<<
+     17       1.8275       1.8404       0.5490   -462.5473950210    -462.5473271953
+     18       1.8322       1.8455       0.5780   -462.5473950223    -462.5473271977
+  >>> On contracte <<<
+     19       1.7758       1.7878       0.5360   -462.5473950223    -462.5473271977
+     20       1.7692       1.7808       0.5400   -462.5473950227    -462.5473271985
+  >>> On contracte <<<
+     21       1.7877       1.8004       0.5440   -462.5473950227    -462.5473271985
+     22       1.7755       1.7883       0.5430   -462.5473950228    -462.5473271988
+  >>> On contracte <<<
+     23       1.7573       1.7699       0.5370   -462.5473950228    -462.5473271988
+     24       1.7827       1.7948       0.5420   -462.5473950229    -462.5473271989
+  >>> On contracte <<<
+     25       1.8401       1.8526       0.5690   -462.5473950229    -462.5473271989
+     26       1.7713       1.7838       0.5420   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     27       1.7843       1.7964       0.5470   -462.5473950229    -462.5473271990
+     28       1.7733       1.7862       0.5410   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     29       1.7611       1.7737       0.5380   -462.5473950229    -462.5473271990
+     30       1.7815       1.7951       0.5500   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     31       1.7703       1.7828       0.5430   -462.5473950229    -462.5473271990
+     32       1.9175       1.9302       0.5780   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     33       1.8629       1.8757       0.5730   -462.5473950229    -462.5473271990
+     34       1.9018       1.9154       0.5800   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     35       1.8810       1.8937       0.5720   -462.5473950229    -462.5473271990
+     36       1.9305       1.9430       0.5870   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     37       2.0252       2.0381       0.6260   -462.5473950229    -462.5473271990
+     38       1.8858       1.8987       0.5830   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     39       1.8892       1.9023       0.5720   -462.5473950229    -462.5473271990
+     40       2.0099       2.0240       0.6060   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     41       1.8688       1.8813       0.5740   -462.5473950229    -462.5473271990
+     42       1.8601       1.8731       0.5700   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     43       1.8234       1.8360       0.5600   -462.5473950229    -462.5473271990
+     44       1.8440       1.8569       0.5690   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     45       1.9460       1.9601       0.5930   -462.5473950229    -462.5473271990
+     46       1.9628       1.9778       0.6080   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     47       1.8730       1.8863       0.5730   -462.5473950229    -462.5473271990
+     48       1.8195       1.8329       0.5560   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     49       1.8599       1.8727       0.5700   -462.5473950229    -462.5473271990
+     50       1.8704       1.8840       0.5730   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     51       1.7985       1.8111       0.5500   -462.5473950229    -462.5473271990
+     52       1.7974       1.8100       0.5500   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     53       1.8697       1.8851       0.5850   -462.5473950229    -462.5473271990
+     54       1.9244       1.9379       0.5820   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     55       2.0245       2.0373       0.6190   -462.5473950229    -462.5473271990
+     56       1.8623       1.8754       0.5790   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     57       1.8534       1.8655       0.5720   -462.5473950229    -462.5473271990
+     58       1.8642       1.8778       0.5730   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     59       1.8734       1.8864       0.5720   -462.5473950229    -462.5473271990
+     60       1.9016       1.9156       0.5840   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     61       1.8634       1.8762       0.5680   -462.5473950229    -462.5473271990
+     62       1.8984       1.9118       0.5790   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     63       1.8254       1.8384       0.5510   -462.5473950229    -462.5473271990
+     64       1.8601       1.8742       0.5700   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     65       1.9429       1.9564       0.5980   -462.5473950229    -462.5473271990
+     66       1.8929       1.9067       0.5790   -462.5473950229    -462.5473271990
+  >>> On contracte <<<
+     67       1.8146       1.8276       0.5490   -462.5473950229    -462.5473271990
+  The vectors            1  seem congerved : we take them out
+     68       1.6852       1.6975       0.5160   -462.5473271990
+     69       1.6029       1.6143       0.4990   -462.5473271990
+  >>> On contracte <<<
+     70       1.5767       1.5881       0.4840   -462.5473271990
+     71       1.5934       1.6053       0.4910   -462.5473271990
+  >>> On contracte <<<
+     72       1.6541       1.6668       0.5090   -462.5473271990
+     73       1.6040       1.6154       0.4930   -462.5473271990
+  >>> On contracte <<<
+     74       1.5952       1.6066       0.4900   -462.5473271990
+     75       1.6677       1.6800       0.5030   -462.5473271990
+  >>> On contracte <<<
+     76       1.6430       1.6540       0.4950   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   76  ncol=  2 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-20 <<<
+ >>> Convergence reached after           75  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.666134E-15    0.887188E-16
+        0.887188E-16   -0.133227E-14
+
+ Energies :   -462.547395022893056    -462.547327199003973
+ E ss ref :     -3.037527684947815      -3.037459861058757
+ dE (a.u.):      0.000000000000000       0.000067823889058
+ dE (meV) :      0.000000000000000       1.845582041859699
+ |Hv-Ev|  :             7.1196E-11              5.0597E-11
+ deltaE   :            -7.9936E-15             -3.1086E-15
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+ Calculation finished in CPUtime           139.64s Walltime:            42.80s
+ Calculation finished on 30-11-2020 at 14:52
diff --git a/test/CuO_03450_allcontraction/test b/test/CuO_03450_allcontraction/test
new file mode 100755
index 0000000000000000000000000000000000000000..51182e641f3e7700d2e2eaad9ab58e4e5616c2b5
--- /dev/null
+++ b/test/CuO_03450_allcontraction/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-11)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_bigbatch_MPIload/INPUT b/test/CuO_03450_bigbatch_MPIload/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..cc56a2f8fa05340254093b6b4a9611b9fb146701
--- /dev/null
+++ b/test/CuO_03450_bigbatch_MPIload/INPUT
@@ -0,0 +1,43 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   mpi_load_balance = .true.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+  SizeheffDavidson = 10,
+  tol_conv = 1.d-10,
+  NiterDavidson = 12
+ &end
+
diff --git a/test/CuO_03450_bigbatch_MPIload/cuo.TraInt b/test/CuO_03450_bigbatch_MPIload/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_bigbatch_MPIload/cuo.TraInt differ
diff --git a/test/CuO_03450_bigbatch_MPIload/cuo.TraOne b/test/CuO_03450_bigbatch_MPIload/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_bigbatch_MPIload/cuo.TraOne differ
diff --git a/test/CuO_03450_bigbatch_MPIload/cuo.ref0 b/test/CuO_03450_bigbatch_MPIload/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_bigbatch_MPIload/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_bigbatch_MPIload/result/cuo.out b/test/CuO_03450_bigbatch_MPIload/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..43540733309475dd07fd7d8afeb47dcae4aead90
--- /dev/null
+++ b/test/CuO_03450_bigbatch_MPIload/result/cuo.out
@@ -0,0 +1,294 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:09
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :  480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in  0.17599999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000036E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.020000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       2.4760       2.5690   -462.5452856260    -462.5452132936
+      2       2.1960       2.2140   -462.5473438544    -462.5472729767
+      3       2.2160       2.2240   -462.5473910781    -462.5473230881
+      4       2.3720       2.3810   -462.5473944973    -462.5473266520
+      5       2.2000       2.2080   -462.5473949684    -462.5473271286
+      6       2.2360       2.2470   -462.5473950180    -462.5473271905
+      7       2.2320       2.2420   -462.5473950222    -462.5473271979
+      8       2.2400       2.2490   -462.5473950228    -462.5473271988
+  The vectors            1  seem congerved : we take them out
+      9       2.2000       2.2110   -462.5473271988
+     10       2.1680       2.1780   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.188738E-14    0.126768E-15
+        0.126768E-15   -0.655032E-14
+
+ Energies :   -462.547395022798923    -462.547327198962932
+ E ss ref :     -3.037527684853703      -3.037459861017721
+ dE (a.u.):      0.000000000000000       0.000067823835982
+ dE (meV) :      0.000000000000000       1.845580597594530
+ |Hv-Ev|  :             9.1813E-06              5.3980E-06
+ deltaE   :            -5.7348E-10             -1.1886E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            25.36s Walltime:            26.04s
+ Calculation finished on 04-09-2019 at 15:09
diff --git a/test/CuO_03450_bigbatch_MPIload/test b/test/CuO_03450_bigbatch_MPIload/test
new file mode 100755
index 0000000000000000000000000000000000000000..0b28fa6c19ba9b31312ba94dcdfc1188e93eaf74
--- /dev/null
+++ b/test/CuO_03450_bigbatch_MPIload/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f}, mpi='mpirun -np 2 ')
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_bigbatch_noMPIload/INPUT b/test/CuO_03450_bigbatch_noMPIload/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..cc217c624e606b048de3ed9208d4b1b068096624
--- /dev/null
+++ b/test/CuO_03450_bigbatch_noMPIload/INPUT
@@ -0,0 +1,43 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   mpi_load_balance = .false.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+  SizeheffDavidson = 10,
+  tol_conv = 1.d-10,
+  NiterDavidson = 12
+ &end
+
diff --git a/test/CuO_03450_bigbatch_noMPIload/cuo.TraInt b/test/CuO_03450_bigbatch_noMPIload/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_bigbatch_noMPIload/cuo.TraInt differ
diff --git a/test/CuO_03450_bigbatch_noMPIload/cuo.TraOne b/test/CuO_03450_bigbatch_noMPIload/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_bigbatch_noMPIload/cuo.TraOne differ
diff --git a/test/CuO_03450_bigbatch_noMPIload/cuo.ref0 b/test/CuO_03450_bigbatch_noMPIload/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_bigbatch_noMPIload/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_bigbatch_noMPIload/result/cuo.out b/test/CuO_03450_bigbatch_noMPIload/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..43540733309475dd07fd7d8afeb47dcae4aead90
--- /dev/null
+++ b/test/CuO_03450_bigbatch_noMPIload/result/cuo.out
@@ -0,0 +1,294 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:09
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :  480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in  0.17599999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000036E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.020000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       2.4760       2.5690   -462.5452856260    -462.5452132936
+      2       2.1960       2.2140   -462.5473438544    -462.5472729767
+      3       2.2160       2.2240   -462.5473910781    -462.5473230881
+      4       2.3720       2.3810   -462.5473944973    -462.5473266520
+      5       2.2000       2.2080   -462.5473949684    -462.5473271286
+      6       2.2360       2.2470   -462.5473950180    -462.5473271905
+      7       2.2320       2.2420   -462.5473950222    -462.5473271979
+      8       2.2400       2.2490   -462.5473950228    -462.5473271988
+  The vectors            1  seem congerved : we take them out
+      9       2.2000       2.2110   -462.5473271988
+     10       2.1680       2.1780   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.188738E-14    0.126768E-15
+        0.126768E-15   -0.655032E-14
+
+ Energies :   -462.547395022798923    -462.547327198962932
+ E ss ref :     -3.037527684853703      -3.037459861017721
+ dE (a.u.):      0.000000000000000       0.000067823835982
+ dE (meV) :      0.000000000000000       1.845580597594530
+ |Hv-Ev|  :             9.1813E-06              5.3980E-06
+ deltaE   :            -5.7348E-10             -1.1886E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            25.36s Walltime:            26.04s
+ Calculation finished on 04-09-2019 at 15:09
diff --git a/test/CuO_03450_bigbatch_noMPIload/test b/test/CuO_03450_bigbatch_noMPIload/test
new file mode 100755
index 0000000000000000000000000000000000000000..0b28fa6c19ba9b31312ba94dcdfc1188e93eaf74
--- /dev/null
+++ b/test/CuO_03450_bigbatch_noMPIload/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f}, mpi='mpirun -np 2 ')
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_nocontraction/INPUT b/test/CuO_03450_nocontraction/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..272c6c11d44601895cbcf1693eadcdc39e45d2ce
--- /dev/null
+++ b/test/CuO_03450_nocontraction/INPUT
@@ -0,0 +1,41 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 100,
+ tol_conv = 1.d-20,
+ &end
+
diff --git a/test/CuO_03450_nocontraction/cuo.TraInt b/test/CuO_03450_nocontraction/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_nocontraction/cuo.TraInt differ
diff --git a/test/CuO_03450_nocontraction/cuo.TraOne b/test/CuO_03450_nocontraction/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_nocontraction/cuo.TraOne differ
diff --git a/test/CuO_03450_nocontraction/cuo.ref0 b/test/CuO_03450_nocontraction/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_nocontraction/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_nocontraction/result/cuo.out b/test/CuO_03450_nocontraction/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..0411ecca7ec868d2fad3eb689c41f7cf1b4c6ed2
--- /dev/null
+++ b/test/CuO_03450_nocontraction/result/cuo.out
@@ -0,0 +1,756 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ DEBUG VersionT
+ MPI version - running on 1 CPUs
+ OMP version - running on 8 threads
+ Calculation started on 30-11-2020 at 14:52
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999995E-021
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        : 100
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-20
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-20
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Ref0:     1  Couches fermees :   0 - 0000 0000  Ref0:     1  Couches ouvertes:   4 - 1111 0000
+  Ref0:     2  Couches fermees :   1 - 1000 0000  Ref0:     2  Couches ouvertes:   2 - 0110 0000
+  Ref0:     3  Couches fermees :   1 - 0100 0000  Ref0:     3  Couches ouvertes:   2 - 1010 0000
+  Ref0:     4  Couches fermees :   1 - 0010 0000  Ref0:     4  Couches ouvertes:   2 - 1100 0000
+  Ref0:     5  Couches fermees :   1 - 1000 0000  Ref0:     5  Couches ouvertes:   2 - 0101 0000
+  Ref0:     6  Couches fermees :   1 - 0100 0000  Ref0:     6  Couches ouvertes:   2 - 1001 0000
+  Ref0:     7  Couches fermees :   1 - 0001 0000  Ref0:     7  Couches ouvertes:   2 - 1100 0000
+  Ref0:     8  Couches fermees :   1 - 1000 0000  Ref0:     8  Couches ouvertes:   2 - 0011 0000
+  Ref0:     9  Couches fermees :   1 - 0001 0000  Ref0:     9  Couches ouvertes:   2 - 1010 0000
+  Ref0:    10  Couches fermees :   1 - 0010 0000  Ref0:    10  Couches ouvertes:   2 - 1001 0000
+  Ref0:    11  Couches fermees :   1 - 0001 0000  Ref0:    11  Couches ouvertes:   2 - 0110 0000
+  Ref0:    12  Couches fermees :   1 - 0100 0000  Ref0:    12  Couches ouvertes:   2 - 0011 0000
+  Ref0:    13  Couches fermees :   1 - 0010 0000  Ref0:    13  Couches ouvertes:   2 - 0101 0000
+  Ref0:    14  Couches fermees :   2 - 1100 0000  Ref0:    14  Couches ouvertes:   0 - 0000 0000
+  Ref0:    15  Couches fermees :   2 - 1010 0000  Ref0:    15  Couches ouvertes:   0 - 0000 0000
+  Ref0:    16  Couches fermees :   2 - 1001 0000  Ref0:    16  Couches ouvertes:   0 - 0000 0000
+  Ref0:    17  Couches fermees :   2 - 0110 0000  Ref0:    17  Couches ouvertes:   0 - 0000 0000
+  Ref0:    18  Couches fermees :   2 - 0101 0000  Ref0:    18  Couches ouvertes:   0 - 0000 0000
+  Ref0:    19  Couches fermees :   2 - 0011 0000  Ref0:    19  Couches ouvertes:   0 - 0000 0000
+
+  Nbre de conf d'espace unique : 19
+  Ref0 irr:     1  Couches fermees :   0 - 0000  Ref0 irr:     1  Couches ouvertes:   4 - 1111
+  Ref0 irr:     2  Couches fermees :   1 - 1000  Ref0 irr:     2  Couches ouvertes:   2 - 0110
+  Ref0 irr:     3  Couches fermees :   1 - 0100  Ref0 irr:     3  Couches ouvertes:   2 - 1010
+  Ref0 irr:     4  Couches fermees :   1 - 0010  Ref0 irr:     4  Couches ouvertes:   2 - 1100
+  Ref0 irr:     5  Couches fermees :   1 - 1000  Ref0 irr:     5  Couches ouvertes:   2 - 0101
+  Ref0 irr:     6  Couches fermees :   1 - 0100  Ref0 irr:     6  Couches ouvertes:   2 - 1001
+  Ref0 irr:     7  Couches fermees :   1 - 0001  Ref0 irr:     7  Couches ouvertes:   2 - 1100
+  Ref0 irr:     8  Couches fermees :   1 - 1000  Ref0 irr:     8  Couches ouvertes:   2 - 0011
+  Ref0 irr:     9  Couches fermees :   1 - 0001  Ref0 irr:     9  Couches ouvertes:   2 - 1010
+  Ref0 irr:    10  Couches fermees :   1 - 0010  Ref0 irr:    10  Couches ouvertes:   2 - 1001
+  Ref0 irr:    11  Couches fermees :   1 - 0001  Ref0 irr:    11  Couches ouvertes:   2 - 0110
+  Ref0 irr:    12  Couches fermees :   1 - 0100  Ref0 irr:    12  Couches ouvertes:   2 - 0011
+  Ref0 irr:    13  Couches fermees :   1 - 0010  Ref0 irr:    13  Couches ouvertes:   2 - 0101
+  Ref0 irr:    14  Couches fermees :   2 - 1100  Ref0 irr:    14  Couches ouvertes:   0 - 0000
+  Ref0 irr:    15  Couches fermees :   2 - 1010  Ref0 irr:    15  Couches ouvertes:   0 - 0000
+  Ref0 irr:    16  Couches fermees :   2 - 1001  Ref0 irr:    16  Couches ouvertes:   0 - 0000
+  Ref0 irr:    17  Couches fermees :   2 - 0110  Ref0 irr:    17  Couches ouvertes:   0 - 0000
+  Ref0 irr:    18  Couches fermees :   2 - 0101  Ref0 irr:    18  Couches ouvertes:   0 - 0000
+  Ref0 irr:    19  Couches fermees :   2 - 0011  Ref0 irr:    19  Couches ouvertes:   0 - 0000
+  Nbre de det Ref0 final : 36
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0011 1100
+0101 1010
+0110 1001
+1001 0110
+1010 0101
+1100 0011
+ Matrix to be diagonalised
+         2.000000     1.000000     1.000000     1.000000     1.000000     0.000000
+         1.000000     2.000000     1.000000     1.000000     0.000000     1.000000
+         1.000000     1.000000     2.000000     0.000000     1.000000     1.000000
+         1.000000     1.000000     0.000000     2.000000     1.000000     1.000000
+         1.000000     0.000000     1.000000     1.000000     2.000000     1.000000
+         0.000000     1.000000     1.000000     1.000000     1.000000     2.000000
+    Valeurs pp de S2
+   0.000000000000   0.000000000000   2.000000000000   2.000000000000   2.000000000000   6.000000000000
+
+    Nbre de conf S, Sz            2
+   -0.000000    0.577350
+   -0.500000   -0.288675
+    0.500000   -0.288675
+    0.500000   -0.288675
+   -0.500000   -0.288675
+    0.000000    0.577350
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+  Ref0 finaux 
+    1   :   0011 1100
+    2   :   0101 1010
+    3   :   0110 1001
+    4   :   1001 0110
+    5   :   1010 0101
+    6   :   1100 0011
+    7   :   1010 1100
+    8   :   1100 1010
+    9   :   0110 1100
+   10   :   1100 0110
+   11   :   0110 1010
+   12   :   1010 0110
+   13   :   1001 1100
+   14   :   1100 1001
+   15   :   0101 1100
+   16   :   1100 0101
+   17   :   0101 1001
+   18   :   1001 0101
+   19   :   1001 1010
+   20   :   1010 1001
+   21   :   0011 1001
+   22   :   1001 0011
+   23   :   0011 1010
+   24   :   1010 0011
+   25   :   0011 0101
+   26   :   0101 0011
+   27   :   0101 0110
+   28   :   0110 0101
+   29   :   0011 0110
+   30   :   0110 0011
+   31   :   1100 1100
+   32   :   1010 1010
+   33   :   1001 1001
+   34   :   0110 0110
+   35   :   0101 0101
+   36   :   0011 0011
+  Nbre de det Ref1 (debug) :   11160
+  Nbre de det Ref1 CAS -> CAS :       0
+  Nbre de det Ref1 ligo-> CAS :     144
+  Nbre de det Ref1 CAS -> ligv:     240
+  Nbre de det Ref1 ligo-> ligv:    1080
+  Nbre de det Ref1 ligo-> ligv + ech :     480
+  Nbre de det Ref1 ligo-> ligv tot:    1560
+  Ref1 Cas  -> Cas  :    1 ->     0
+===
+Active determinant list R_-2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+===
+Active determinant list R_-1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_0
+Contains 70 determinants
+           0           2          -2           4          -4
+          36          16          16           1           1
+===
+Active determinant list R_1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+  >>> Generation of D0
+ Estimated nb of det. 70
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+ Estimated nb of det. 4200
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+ Estimated nb of det. 252000
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+ Estimated nb of det. 336
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+ Estimated nb of det. 20160
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+ Estimated nb of det. 560
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+ Estimated nb of det. 33600
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+ Estimated nb of det. 1008
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+ Estimated nb of det. 2800
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in   4.9475999999999992E-002 second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  BSLbl = 
+    Irrep =  1
+         1  CU01  1s  
+         2  CU01  2px 
+         3  CU01  2px 
+         4  CU01  2py 
+         5  CU01  2py 
+         6  CU01  2pz 
+         7  CU01  2pz 
+         8  CU01  3d2-
+         9  CU01  3d2-
+        10  CU01  3d1-
+        11  CU01  3d1-
+        12  CU01  3d0 
+        13  CU01  3d0 
+        14  CU01  3d1+
+        15  CU01  3d1+
+        16  CU01  3d2+
+        17  CU01  3d2+
+        18  CU02  1s  
+        19  CU02  2px 
+        20  CU02  2px 
+        21  CU02  2py 
+        22  CU02  2py 
+        23  CU02  2pz 
+        24  CU02  2pz 
+        25  CU02  3d2-
+        26  CU02  3d2-
+        27  CU02  3d1-
+        28  CU02  3d1-
+        29  CU02  3d0 
+        30  CU02  3d0 
+        31  CU02  3d1+
+        32  CU02  3d1+
+        33  CU02  3d2+
+        34  CU02  3d2+
+        35  O_03  1s  
+        36  O_03  2px 
+        37  O_03  2px 
+        38  O_03  2py 
+        39  O_03  2py 
+        40  O_03  2pz 
+        41  O_03  2pz 
+        42  O_03  3d2-
+        43  O_03  3d1-
+        44  O_03  3d0 
+        45  O_03  3d1+
+        46  O_03  3d2+
+        47  O_04  1s  
+        48  O_04  2px 
+        49  O_04  2px 
+        50  O_04  2py 
+        51  O_04  2py 
+        52  O_04  2pz 
+        53  O_04  2pz 
+        54  O_04  3d2-
+        55  O_04  3d1-
+        56  O_04  3d0 
+        57  O_04  3d1+
+        58  O_04  3d2+
+        59  O_05  1s  
+        60  O_05  2px 
+        61  O_05  2px 
+        62  O_05  2py 
+        63  O_05  2py 
+        64  O_05  2pz 
+        65  O_05  2pz 
+        66  O_05  3d2-
+        67  O_05  3d1-
+        68  O_05  3d0 
+        69  O_05  3d1+
+        70  O_05  3d2+
+        71  O_06  1s  
+        72  O_06  2px 
+        73  O_06  2px 
+        74  O_06  2py 
+        75  O_06  2py 
+        76  O_06  2pz 
+        77  O_06  2pz 
+        78  O_06  3d2-
+        79  O_06  3d1-
+        80  O_06  3d0 
+        81  O_06  3d1+
+        82  O_06  3d2+
+        83  O_07  1s  
+        84  O_07  2px 
+        85  O_07  2px 
+        86  O_07  2py 
+        87  O_07  2py 
+        88  O_07  2pz 
+        89  O_07  2pz 
+        90  O_07  3d2-
+        91  O_07  3d1-
+        92  O_07  3d0 
+        93  O_07  3d1+
+        94  O_07  3d2+
+        95  O_08  1s  
+        96  O_08  2px 
+        97  O_08  2px 
+        98  O_08  2py 
+        99  O_08  2py 
+       100  O_08  2pz 
+       101  O_08  2pz 
+       102  O_08  3d2-
+       103  O_08  3d1-
+       104  O_08  3d0 
+       105  O_08  3d1+
+       106  O_08  3d2+
+       107  O_09  1s  
+       108  O_09  2px 
+       109  O_09  2px 
+       110  O_09  2py 
+       111  O_09  2py 
+       112  O_09  2pz 
+       113  O_09  2pz 
+       114  O_09  3d2-
+       115  O_09  3d1-
+       116  O_09  3d0 
+       117  O_09  3d1+
+       118  O_09  3d2+
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   5.7250000000000079E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   1.1450000000000071E-003 second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.052212 second(s)  Wall time:    0.017000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   9.7099999999999964E-004 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-10
+
+Total Elapsed tWall       0.0850s
+Particles are divided in batches of 40
+  #Iter  tallCPU (s)    tCPU0 (s)   tWall0 (s)  Energies
+      0       0.0000       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.0388       0.0416       0.0170   -462.5452856260    -462.5452132936
+      2       1.8095       1.8216       0.5470   -462.5473438544    -462.5472729767
+      3       1.8145       1.8281       0.5460   -462.5473910781    -462.5473230881
+      4       1.8000       1.8131       0.5440   -462.5473944973    -462.5473266520
+      5       1.7973       1.8106       0.5460   -462.5473949684    -462.5473271286
+      6       1.7993       1.8125       0.5450   -462.5473950180    -462.5473271905
+      7       1.7839       1.7971       0.5440   -462.5473950222    -462.5473271979
+      8       2.0165       2.0306       0.6140   -462.5473950228    -462.5473271988
+      9       1.9808       1.9950       0.6180   -462.5473950229    -462.5473271990
+     10       2.0699       2.0837       0.6340   -462.5473950229    -462.5473271990
+     11       1.9849       1.9979       0.5870   -462.5473950229    -462.5473271990
+     12       1.9623       1.9766       0.5850   -462.5473950229    -462.5473271990
+     13       1.9710       1.9858       0.6090   -462.5473950229    -462.5473271990
+     14       1.7700       1.7842       0.5390   -462.5473950229    -462.5473271990
+     15       1.7678       1.7820       0.5410   -462.5473950229    -462.5473271990
+     16       1.7678       1.7820       0.5380   -462.5473950229    -462.5473271990
+     17       1.7858       1.8009       0.5460   -462.5473950229    -462.5473271990
+     18       1.7521       1.7656       0.5370   -462.5473950229    -462.5473271990
+     19       1.7670       1.7820       0.5420   -462.5473950229    -462.5473271990
+  The vectors            1  seem congerved : we take them out
+     20       1.5657       1.5771       0.4830   -462.5473271990
+     21       1.5751       1.5872       0.4880   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   21  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-20 <<<
+ >>> Convergence reached after           20  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.444089E-15    0.132873E-15
+        0.132873E-15   -0.128786E-13
+
+ Energies :   -462.547395022893056    -462.547327199004030
+ E ss ref :     -3.037527684947849      -3.037459861058789
+ dE (a.u.):      0.000000000000000       0.000067823889060
+ dE (meV) :      0.000000000000000       1.845582041920121
+ |Hv-Ev|  :             7.2356E-11              6.2184E-11
+ deltaE   :             2.2204E-15              0.0000E+00
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+ Calculation finished in CPUtime            40.26s Walltime:            13.29s
+ Calculation finished on 30-11-2020 at 14:52
diff --git a/test/CuO_03450_nocontraction/test b/test/CuO_03450_nocontraction/test
new file mode 100755
index 0000000000000000000000000000000000000000..51182e641f3e7700d2e2eaad9ab58e4e5616c2b5
--- /dev/null
+++ b/test/CuO_03450_nocontraction/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-11)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_nodet2/INPUT b/test/CuO_03450_nodet2/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..10ec84504bb240cbd47212178b85a991eb4899ed
--- /dev/null
+++ b/test/CuO_03450_nodet2/INPUT
@@ -0,0 +1,43 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   nodet_block(2) = .true.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ debug_dav = .true.
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_03450_nodet2/cuo.TraInt b/test/CuO_03450_nodet2/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_nodet2/cuo.TraInt differ
diff --git a/test/CuO_03450_nodet2/cuo.TraOne b/test/CuO_03450_nodet2/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_nodet2/cuo.TraOne differ
diff --git a/test/CuO_03450_nodet2/cuo.ref0 b/test/CuO_03450_nodet2/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_nodet2/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_nodet2/result/cuo.out b/test/CuO_03450_nodet2/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..b5845b1e9a707987bf40d5fe3a02b5cb5c0edf36
--- /dev/null
+++ b/test/CuO_03450_nodet2/result/cuo.out
@@ -0,0 +1,483 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 07-12-2020 at 22:14
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+ bmat :                                                                        cuo.bmat
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :     480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Determinant block D1 was turned off by nodet_block input keyword
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         25000
+ >>>Determinants generated in   3.4706999999999995E-002 second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.6869999999999967E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   3.8099999999999939E-004 second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.008171 second(s)  Wall time:    0.008000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+
+ <D00|H|D00> block of the Hamiltonian matrix
+        -2.1547630510452089     0.4071467349282018    -0.0011661827330583    -0.0015843635972472     0.0023734703309500     0.0000000000000000     0.0000361007291845     0.0000000000000000     0.0010476545529083     0.0000000000000000
+         0.4071467349282018    -2.1544585668705412     0.0011374786198633     0.0019175518851102     0.0000000000000000     0.0023734703309500     0.0000000000000000    -0.0000365697427802    -0.0057695230971876     0.0003201229112734
+        -0.0011661827330583     0.0011374786198633    -2.5612282257993875     0.0000000000000000     0.0019175518851102    -0.0015843635972472    -0.0001218490048947     0.0000491785329300    -0.0064970547388225     0.0000000000000000
+        -0.0015843635972472     0.0019175518851102     0.0000000000000000    -2.5612282257993875     0.0011374786198633    -0.0011661827330583     0.0000491785329300    -0.0001218490048947     0.0000000000000000    -0.0064970547388225
+         0.0023734703309500     0.0000000000000000     0.0019175518851102     0.0011374786198633    -2.1544585668705412     0.4071467349282018    -0.0000365697427802     0.0000000000000000     0.0003201229112734    -0.0057695230971876
+         0.0000000000000000     0.0023734703309500    -0.0015843635972472    -0.0011661827330583     0.4071467349282018    -2.1547630510452089     0.0000000000000000     0.0000361007291845     0.0000000000000000     0.0010476545529083
+         0.0000361007291845     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0000365697427802     0.0000000000000000    -2.6282995203255211     0.4071467349282018     0.0043610372579453     0.0043610619802855
+         0.0000000000000000    -0.0000365697427802     0.0000491785329300    -0.0001218490048947     0.0000000000000000     0.0000361007291845     0.4071467349282018    -2.6282995203255215     0.0043610619802855     0.0043610372579453
+         0.0010476545529083    -0.0057695230971876    -0.0064970547388225     0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0043610372579453     0.0043610619802855    -2.5417396557075262     0.0015843635972472
+         0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0064970547388225    -0.0057695230971876     0.0010476545529083     0.0043610619802855     0.0043610372579453     0.0015843635972472    -2.5417396557075267
+        -0.0006131819477916     0.0032677508563468     0.0036968202669343     0.0000000000000000     0.0000000000000000     0.0001841125372042     0.0004697137488920     0.0004697813153107    -0.0325751993364660    -0.0006592015415139
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0036968202669343     0.0032677508563468    -0.0006131819477916     0.0004697813153107     0.0004697137488920    -0.0006592015415139    -0.0325751993364660
+         0.0000120738777536     0.0004697137488920     0.0000000000000000     0.0009965899166763     0.0005389500455378     0.0000000000000000     0.0006132407390550     0.0006131819477916    -0.0028000248843868    -0.0001744684336959
+         0.0000000000000000     0.0005389500455378     0.0009965899166763     0.0000000000000000     0.0004697137488920     0.0000120738777536     0.0006131819477916     0.0006132407390550    -0.0001744684336959    -0.0028000248843868
+         0.0256599488464450     0.0251076560274124     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000     0.0000240082573146    -0.0029985015753972     0.0018640591165045     0.0001841125372042
+         0.0000000000000000     0.0000000000000000    -0.0006592015415139     0.0001069087224813     0.0251076560274124     0.0256599488464450    -0.0029985015753972     0.0000240082573146     0.0001841125372042     0.0018640591165045
+         0.0006131819477916     0.0017482055185013     0.0013191361079138     0.0000000000000000     0.0000000000000000    -0.0001841125372042     0.0000000000000000     0.0005389500455378     0.0001069087224813     0.0000000000000000
+        -0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0013191361079138     0.0017482055185013     0.0006131819477916     0.0005389500455378     0.0000000000000000     0.0000000000000000     0.0001069087224813
+        -0.0043610619802855     0.0069141002392945     0.0000000000000000     0.0118806995968195     0.0000000000000000    -0.0006055373772395    -0.0057695230971876    -0.0057694833032892     0.0000000000000000    -0.0001218490048947
+        -0.0006055373772395     0.0000000000000000     0.0118806995968195     0.0000000000000000     0.0069141002392945    -0.0043610619802855    -0.0057694833032892    -0.0057695230971876    -0.0001218490048947     0.0000000000000000
+        -0.0033610014536205    -0.0057695230971876    -0.0020883987322937     0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0006055373772395     0.0000000000000000    -0.0011661827330583     0.0000000000000000
+         0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0020883987322937    -0.0057695230971876    -0.0033610014536205     0.0000000000000000    -0.0006055373772395     0.0000000000000000    -0.0011661827330583
+        -0.0766362282479228    -0.0760839354288902    -0.0001069087224813     0.0006592015415139     0.0000000000000000     0.0000000000000000    -0.0029985015753972    -0.0000240082573146    -0.0006131819477916     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813    -0.0760839354288902    -0.0766362282479228    -0.0000240082573146    -0.0029985015753972     0.0000000000000000    -0.0006131819477916
+        -0.0025152336735863     0.0000000000000000     0.0001218490048947    -0.0000491785329300    -0.0024425632016216     0.0000000000000000     0.0023734703309500     0.0000000000000000     0.0006055373772395     0.0000000000000000
+         0.0000000000000000    -0.0024425632016216    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0025152336735863     0.0000000000000000     0.0023734703309500     0.0000000000000000     0.0006055373772395
+         0.0043610619802855    -0.0039799338629701     0.0000000000000000    -0.0089465332204950     0.0000000000000000     0.0006055373772395     0.0000000000000000     0.0003201229112734     0.0000491785329300    -0.0005921137406156
+         0.0006055373772395     0.0000000000000000    -0.0089465332204950     0.0000000000000000    -0.0039799338629701     0.0043610619802855     0.0003201229112734     0.0000000000000000    -0.0005921137406156     0.0000491785329300
+         0.0089617123396187     0.0004697137488920     0.0000000000000000    -0.0079530485451888     0.0005389500455378     0.0000000000000000     0.0001841125372042     0.0000000000000000     0.0001744684336959    -0.0000240082573146
+         0.0000000000000000     0.0005389500455378    -0.0079530485451888     0.0000000000000000     0.0004697137488920     0.0089617123396187     0.0000000000000000     0.0001841125372042    -0.0000240082573146     0.0001744684336959
+        -0.0000240082573146    -0.0029985015753972    -0.0001744684336959    -0.0001744684336959    -0.0029985015753972    -0.0000240082573146     0.0488408974744276     0.0488408974744276     0.0014159377081494     0.0014159377081494
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972    -0.0529029868009075    -0.0529029868009075     0.0004697137488920     0.0004697137488920
+         0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104     0.0001744684336959     0.0001069087224813     0.0001069087224813     0.0000000000000000     0.0000000000000000
+         0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104     0.0001744684336959    -0.0006592015415139    -0.0006592015415139     0.0093810601310918     0.0093810601310918
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0000000000000000     0.0005389500455378     0.0005389500455378
+        -0.0000240082573146    -0.0029985015753972    -0.0001744684336959    -0.0001744684336959    -0.0029985015753972    -0.0000240082573146     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+
+        -0.0006131819477916     0.0001841125372042     0.0000120738777536     0.0000000000000000     0.0256599488464450     0.0000000000000000     0.0006131819477916    -0.0001841125372042    -0.0043610619802855    -0.0006055373772395
+         0.0032677508563468     0.0000000000000000     0.0004697137488920     0.0005389500455378     0.0251076560274124     0.0000000000000000     0.0017482055185013     0.0000000000000000     0.0069141002392945     0.0000000000000000
+         0.0036968202669343     0.0000000000000000     0.0000000000000000     0.0009965899166763     0.0001069087224813    -0.0006592015415139     0.0013191361079138     0.0000000000000000     0.0000000000000000     0.0118806995968195
+         0.0000000000000000     0.0036968202669343     0.0009965899166763     0.0000000000000000    -0.0006592015415139     0.0001069087224813     0.0000000000000000     0.0013191361079138     0.0118806995968195     0.0000000000000000
+         0.0000000000000000     0.0032677508563468     0.0005389500455378     0.0004697137488920     0.0000000000000000     0.0251076560274124     0.0000000000000000     0.0017482055185013     0.0000000000000000     0.0069141002392945
+         0.0001841125372042    -0.0006131819477916     0.0000000000000000     0.0000120738777536     0.0000000000000000     0.0256599488464450    -0.0001841125372042     0.0006131819477916    -0.0006055373772395    -0.0043610619802855
+         0.0004697137488920     0.0004697813153107     0.0006132407390550     0.0006131819477916     0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0005389500455378    -0.0057695230971876    -0.0057694833032892
+         0.0004697813153107     0.0004697137488920     0.0006131819477916     0.0006132407390550    -0.0029985015753972     0.0000240082573146     0.0005389500455378     0.0000000000000000    -0.0057694833032892    -0.0057695230971876
+        -0.0325751993364660    -0.0006592015415139    -0.0028000248843868    -0.0001744684336959     0.0018640591165045     0.0001841125372042     0.0001069087224813     0.0000000000000000     0.0000000000000000    -0.0001218490048947
+        -0.0006592015415139    -0.0325751993364660    -0.0001744684336959    -0.0028000248843868     0.0001841125372042     0.0018640591165045     0.0000000000000000     0.0001069087224813    -0.0001218490048947     0.0000000000000000
+        -2.5286086870670714     0.0019175518851102     0.0000000000000000     0.0000491785329300    -0.0057695230971876     0.0000000000000000     0.0011374786198633     0.0000000000000000    -0.0028000248843868     0.0001984766910104
+         0.0019175518851102    -2.5286086870670714     0.0000491785329300     0.0000000000000000     0.0000000000000000    -0.0057695230971876     0.0000000000000000     0.0011374786198633     0.0001984766910104    -0.0028000248843868
+         0.0000000000000000     0.0000491785329300    -2.3044098187887054     0.0011661827330583     0.0069437102765272    -0.0006055373772395    -0.0001218490048947    -0.0026432424922423     0.0047798685629708     0.0001069087224813
+         0.0000491785329300     0.0000000000000000     0.0011661827330583    -2.3044098187887054    -0.0006055373772395     0.0069437102765272    -0.0026432424922423    -0.0001218490048947     0.0001069087224813     0.0047798685629708
+        -0.0057695230971876     0.0000000000000000     0.0069437102765272    -0.0006055373772395    -2.1570441077522013     0.0023734703309500    -0.0030999602738745     0.0003201229112734     0.0004697137488920     0.0000000000000000
+         0.0000000000000000    -0.0057695230971876    -0.0006055373772395     0.0069437102765272     0.0023734703309500    -2.1570441077522013     0.0003201229112734    -0.0030999602738745     0.0000000000000000     0.0004697137488920
+         0.0011374786198633     0.0000000000000000    -0.0001218490048947    -0.0026432424922423    -0.0030999602738745     0.0003201229112734    -1.7556658823452174     0.0019175518851102     0.0001984766910104     0.0000240082573146
+         0.0000000000000000     0.0011374786198633    -0.0026432424922423    -0.0001218490048947     0.0003201229112734    -0.0030999602738745     0.0019175518851102    -1.7556658823452174     0.0000240082573146     0.0001984766910104
+        -0.0028000248843868     0.0001984766910104     0.0047798685629708     0.0001069087224813     0.0004697137488920     0.0000000000000000     0.0001984766910104     0.0000240082573146    -2.2933565154552094     0.0011374786198633
+         0.0001984766910104    -0.0028000248843868     0.0001069087224813     0.0047798685629708     0.0000000000000000     0.0004697137488920     0.0000240082573146     0.0001984766910104     0.0011374786198633    -2.2933565154552094
+        -0.0001069087224813     0.0000000000000000     0.0001744684336959    -0.0000240082573146     0.0006131819477916     0.0000000000000000    -0.0184010800650118     0.0006592015415139    -0.0000491785329300    -0.0018870192037862
+         0.0000000000000000    -0.0001069087224813    -0.0000240082573146     0.0001744684336959     0.0000000000000000     0.0006131819477916     0.0006592015415139    -0.0184010800650118    -0.0018870192037862    -0.0000491785329300
+         0.0013086957326543     0.0003201229112734    -0.0043610619802855     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0057695230971876     0.0000000000000000     0.0009582302705923     0.0005389500455378
+         0.0003201229112734     0.0013086957326543     0.0000000000000000    -0.0043610619802855     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0057695230971876     0.0005389500455378     0.0009582302705923
+         0.0000000000000000     0.0005389500455378    -0.0001841125372042     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0004697137488920    -0.0084798571465544     0.0000000000000000     0.0003201229112734
+         0.0005389500455378     0.0000000000000000     0.0000000000000000    -0.0001841125372042    -0.0000240082573146    -0.0029985015753972    -0.0084798571465544     0.0004697137488920     0.0003201229112734     0.0000000000000000
+         0.0001984766910104     0.0000240082573146    -0.0006592015415139     0.0000000000000000     0.0099078687324574     0.0005389500455378    -0.0028000248843868     0.0001984766910104     0.0019175518851102     0.0000000000000000
+         0.0000240082573146     0.0001984766910104     0.0000000000000000    -0.0006592015415139     0.0005389500455378     0.0099078687324574     0.0001984766910104    -0.0028000248843868     0.0000000000000000     0.0019175518851102
+         0.0001218490048947     0.0001641095478405    -0.0015843635972472     0.0000000000000000     0.0043610619802855     0.0000000000000000     0.0000000000000000    -0.0000491785329300     0.0006592015415139     0.0000000000000000
+         0.0001641095478405     0.0001218490048947     0.0000000000000000    -0.0015843635972472     0.0000000000000000     0.0043610619802855    -0.0000491785329300     0.0000000000000000     0.0000000000000000     0.0006592015415139
+         0.0043610619802855     0.0043610619802855    -0.0055084421235432    -0.0055084421235432    -0.0007201225592716    -0.0007201225592716    -0.0006055373772395    -0.0006055373772395     0.0006131819477916     0.0006131819477916
+         0.0043314272207127     0.0043314272207127    -0.0057695230971876    -0.0057695230971876     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0020169324788974     0.0020169324788974
+         0.0000000000000000     0.0000000000000000    -0.0023723888383412    -0.0023723888383412    -0.0001218490048947    -0.0001218490048947     0.0144633726154013     0.0144633726154013     0.0000683177304644     0.0000683177304644
+        -0.0115292062390769    -0.0115292062390769     0.0000000000000000     0.0000000000000000     0.0000491785329300     0.0000491785329300     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0003201229112734    -0.0031987864900777    -0.0031987864900777    -0.0013972608443882    -0.0013972608443882     0.0000000000000000     0.0000000000000000
+         0.0006055373772395     0.0006055373772395     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000    -0.0043610619802855    -0.0043610619802855    -0.0001841125372042    -0.0001841125372042
+
+        -0.0033610014536205     0.0000000000000000    -0.0766362282479228     0.0000000000000000    -0.0025152336735863     0.0000000000000000     0.0043610619802855     0.0006055373772395     0.0089617123396187     0.0000000000000000
+        -0.0057695230971876     0.0003201229112734    -0.0760839354288902     0.0000000000000000     0.0000000000000000    -0.0024425632016216    -0.0039799338629701     0.0000000000000000     0.0004697137488920     0.0005389500455378
+        -0.0020883987322937     0.0000000000000000    -0.0001069087224813     0.0006592015415139     0.0001218490048947    -0.0000491785329300     0.0000000000000000    -0.0089465332204950     0.0000000000000000    -0.0079530485451888
+         0.0000000000000000    -0.0020883987322937     0.0006592015415139    -0.0001069087224813    -0.0000491785329300     0.0001218490048947    -0.0089465332204950     0.0000000000000000    -0.0079530485451888     0.0000000000000000
+         0.0003201229112734    -0.0057695230971876     0.0000000000000000    -0.0760839354288902    -0.0024425632016216     0.0000000000000000     0.0000000000000000    -0.0039799338629701     0.0005389500455378     0.0004697137488920
+         0.0000000000000000    -0.0033610014536205     0.0000000000000000    -0.0766362282479228     0.0000000000000000    -0.0025152336735863     0.0006055373772395     0.0043610619802855     0.0000000000000000     0.0089617123396187
+        -0.0006055373772395     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0023734703309500     0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0001841125372042     0.0000000000000000
+         0.0000000000000000    -0.0006055373772395    -0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0023734703309500     0.0003201229112734     0.0000000000000000     0.0000000000000000     0.0001841125372042
+        -0.0011661827330583     0.0000000000000000    -0.0006131819477916     0.0000000000000000     0.0006055373772395     0.0000000000000000     0.0000491785329300    -0.0005921137406156     0.0001744684336959    -0.0000240082573146
+         0.0000000000000000    -0.0011661827330583     0.0000000000000000    -0.0006131819477916     0.0000000000000000     0.0006055373772395    -0.0005921137406156     0.0000491785329300    -0.0000240082573146     0.0001744684336959
+        -0.0001069087224813     0.0000000000000000     0.0013086957326543     0.0003201229112734     0.0000000000000000     0.0005389500455378     0.0001984766910104     0.0000240082573146     0.0001218490048947     0.0001641095478405
+         0.0000000000000000    -0.0001069087224813     0.0003201229112734     0.0013086957326543     0.0005389500455378     0.0000000000000000     0.0000240082573146     0.0001984766910104     0.0001641095478405     0.0001218490048947
+         0.0001744684336959    -0.0000240082573146    -0.0043610619802855     0.0000000000000000    -0.0001841125372042     0.0000000000000000    -0.0006592015415139     0.0000000000000000    -0.0015843635972472     0.0000000000000000
+        -0.0000240082573146     0.0001744684336959     0.0000000000000000    -0.0043610619802855     0.0000000000000000    -0.0001841125372042     0.0000000000000000    -0.0006592015415139     0.0000000000000000    -0.0015843635972472
+         0.0006131819477916     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0099078687324574     0.0005389500455378     0.0043610619802855     0.0000000000000000
+         0.0000000000000000     0.0006131819477916     0.0000000000000000     0.4071467349282018    -0.0000240082573146    -0.0029985015753972     0.0005389500455378     0.0099078687324574     0.0000000000000000     0.0043610619802855
+        -0.0184010800650118     0.0006592015415139    -0.0057695230971876     0.0000000000000000     0.0004697137488920    -0.0084798571465544    -0.0028000248843868     0.0001984766910104     0.0000000000000000    -0.0000491785329300
+         0.0006592015415139    -0.0184010800650118     0.0000000000000000    -0.0057695230971876    -0.0084798571465544     0.0004697137488920     0.0001984766910104    -0.0028000248843868    -0.0000491785329300     0.0000000000000000
+        -0.0000491785329300    -0.0018870192037862     0.0009582302705923     0.0005389500455378     0.0000000000000000     0.0003201229112734     0.0019175518851102     0.0000000000000000     0.0006592015415139     0.0000000000000000
+        -0.0018870192037862    -0.0000491785329300     0.0005389500455378     0.0009582302705923     0.0003201229112734     0.0000000000000000     0.0000000000000000     0.0019175518851102     0.0000000000000000     0.0006592015415139
+        -1.7381940045445994     0.0015843635972472     0.0031518972583437    -0.0001841125372042    -0.0014268708816209    -0.0043610619802855     0.0000000000000000     0.0001218490048947    -0.0028000248843868    -0.0001744684336959
+         0.0015843635972472    -1.7381940045446000    -0.0001841125372042     0.0031518972583437    -0.0043610619802855    -0.0014268708816209     0.0001218490048947     0.0000000000000000    -0.0001744684336959    -0.0028000248843868
+         0.0031518972583437    -0.0001841125372042    -2.1264412613111281     0.0023734703309500     0.0000240082573146    -0.0029985015753972     0.0004697137488920     0.0000000000000000    -0.0040095439002027     0.0006055373772395
+        -0.0001841125372042     0.0031518972583437     0.0023734703309500    -2.1264412613111281    -0.0029985015753972     0.0000240082573146     0.0000000000000000     0.0004697137488920     0.0006055373772395    -0.0040095439002027
+        -0.0014268708816209    -0.0043610619802855     0.0000240082573146    -0.0029985015753972    -1.3892104983684459     0.4071467349282018    -0.0057695230971876    -0.0013608272967604     0.0044027156357931    -0.0006131819477916
+        -0.0043610619802855    -0.0014268708816209    -0.0029985015753972     0.0000240082573146     0.4071467349282018    -1.3892104983684466    -0.0013608272967604    -0.0057695230971876    -0.0006131819477916     0.0044027156357931
+         0.0000000000000000     0.0001218490048947     0.0004697137488920     0.0000000000000000    -0.0057695230971876    -0.0013608272967604    -1.8578131446610602     0.0011374786198633    -0.0557561479644486    -0.0001069087224813
+         0.0001218490048947     0.0000000000000000     0.0000000000000000     0.0004697137488920    -0.0013608272967604    -0.0057695230971876     0.0011374786198633    -1.8578131446610597    -0.0001069087224813    -0.0557561479644486
+        -0.0028000248843868    -0.0001744684336959    -0.0040095439002027     0.0006055373772395     0.0044027156357931    -0.0006131819477916    -0.0557561479644486    -0.0001069087224813    -1.8382636015534830     0.0011661827330583
+        -0.0001744684336959    -0.0028000248843868     0.0006055373772395    -0.0040095439002027    -0.0006131819477916     0.0044027156357931    -0.0001069087224813    -0.0557561479644486     0.0011661827330583    -1.8382636015534832
+         0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0001841125372042     0.0001841125372042     0.0000000000000000     0.0000000000000000
+         0.0005389500455378     0.0005389500455378     0.0007196535456759     0.0007196535456759     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0003201229112734
+         0.0004314216692267     0.0004314216692267    -0.0000491785329300    -0.0000491785329300     0.0006592015415139     0.0006592015415139     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0001218490048947     0.0001218490048947    -0.0001069087224813    -0.0001069087224813     0.0049476386443837     0.0049476386443837     0.0020362671681876     0.0020362671681876
+         0.0004697137488920     0.0004697137488920     0.0000000000000000     0.0000000000000000     0.0019267073994297     0.0019267073994297     0.0029990238959507     0.0029990238959507    -0.0057695230971876    -0.0057695230971876
+        -0.0075337007537157    -0.0075337007537157    -0.0017590103851302    -0.0017590103851302    -0.0998171768759054    -0.0998171768759054    -0.0006131819477916    -0.0006131819477916    -0.0010997861170144    -0.0010997861170144
+
+        -0.0000240082573146    -0.0029985015753972     0.0001744684336959     0.0001744684336959    -0.0029985015753972    -0.0000240082573146
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972
+        -0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104    -0.0001744684336959
+        -0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104    -0.0001744684336959
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972
+        -0.0000240082573146    -0.0029985015753972     0.0001744684336959     0.0001744684336959    -0.0029985015753972    -0.0000240082573146
+         0.0488408974744276    -0.0529029868009075     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000
+         0.0488408974744276    -0.0529029868009075     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000
+         0.0014159377081494     0.0004697137488920     0.0000000000000000     0.0093810601310918     0.0005389500455378     0.0000000000000000
+         0.0014159377081494     0.0004697137488920     0.0000000000000000     0.0093810601310918     0.0005389500455378     0.0000000000000000
+         0.0043610619802855     0.0043314272207127     0.0000000000000000    -0.0115292062390769     0.0000000000000000     0.0006055373772395
+         0.0043610619802855     0.0043314272207127     0.0000000000000000    -0.0115292062390769     0.0000000000000000     0.0006055373772395
+        -0.0055084421235432    -0.0057695230971876    -0.0023723888383412     0.0000000000000000     0.0003201229112734     0.0000000000000000
+        -0.0055084421235432    -0.0057695230971876    -0.0023723888383412     0.0000000000000000     0.0003201229112734     0.0000000000000000
+        -0.0007201225592716     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0031987864900777     0.0000000000000000
+        -0.0007201225592716     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0031987864900777     0.0000000000000000
+        -0.0006055373772395     0.0000000000000000     0.0144633726154013     0.0000000000000000    -0.0013972608443882    -0.0043610619802855
+        -0.0006055373772395     0.0000000000000000     0.0144633726154013     0.0000000000000000    -0.0013972608443882    -0.0043610619802855
+         0.0006131819477916     0.0020169324788974     0.0000683177304644     0.0000000000000000     0.0000000000000000    -0.0001841125372042
+         0.0006131819477916     0.0020169324788974     0.0000683177304644     0.0000000000000000     0.0000000000000000    -0.0001841125372042
+         0.0000000000000000     0.0005389500455378     0.0004314216692267     0.0000000000000000     0.0004697137488920    -0.0075337007537157
+         0.0000000000000000     0.0005389500455378     0.0004314216692267     0.0000000000000000     0.0004697137488920    -0.0075337007537157
+         0.0000000000000000     0.0007196535456759    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0017590103851302
+         0.0000000000000000     0.0007196535456759    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0017590103851302
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813     0.0019267073994297    -0.0998171768759054
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813     0.0019267073994297    -0.0998171768759054
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0049476386443837     0.0029990238959507    -0.0006131819477916
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0049476386443837     0.0029990238959507    -0.0006131819477916
+         0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0020362671681876    -0.0057695230971876    -0.0010997861170144
+         0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0020362671681876    -0.0057695230971876    -0.0010997861170144
+        -2.6241620025653924     0.4071467349282018     0.0011661827330583     0.0015843635972472     0.0023734703309500     0.0000000000000000
+         0.4071467349282018    -2.6067007892332303     0.0011374786198633     0.0019175518851102     0.0000000000000000     0.0023734703309500
+         0.0011661827330583     0.0011374786198633    -1.5486000184195474     0.0000000000000000     0.0019175518851102     0.0015843635972472
+         0.0015843635972472     0.0019175518851102     0.0000000000000000    -1.8859994523472516     0.0011374786198633     0.0011661827330583
+         0.0023734703309500     0.0000000000000000     0.0019175518851102     0.0011374786198633    -1.3982146137172276     0.4071467349282018
+         0.0000000000000000     0.0023734703309500     0.0015843635972472     0.0011661827330583     0.4071467349282018    -1.3544701341672443
+
+ Eigenvalues of the D00-D00 Matrix
+  1  -462.5453567367527512
+  2  -462.5452843057054793
+  3  -462.0809683040457116
+  4  -462.0790176130660711
+  5  -462.0769058933238966
+  6  -462.0756069042187164
+  7  -462.0706931299682196
+  8  -462.0702641726454658
+  9  -462.0696254192293964
+  10  -462.0688970804107498
+  11  -462.0125572006065795
+  12  -462.0085863490550082
+  13  -461.8168292866441220
+  14  -461.8162470136301749
+  15  -461.8019372134087916
+  16  -461.8008678923476396
+  17  -461.7219252276019006
+  18  -461.7111541632574472
+  19  -461.4162024419536010
+  20  -461.4156014605839005
+  21  -461.3926897818469683
+  22  -461.3129862112451178
+  23  -461.3120983413513727
+  24  -461.3005977770960726
+  25  -461.2984584179386047
+  26  -461.2970430800617123
+  27  -461.2947906439143253
+  28  -461.2757125623879801
+  29  -461.2736214154912773
+  30  -461.2391577801855078
+  31  -461.2367947928008221
+  32  -461.1920697706506758
+  33  -461.1877085388319415
+  34  -461.0564044231625189
+  35  -460.5785719306652481
+  36  -460.3791309835817174
+ >>> H0 diagonalised in   8.6800000000000072E-004 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+Total Elapsed tWall       0.0630s
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.4364       0.4370   -462.5452856260    -462.5452132936
+      2       0.4227       0.4230   -462.5472296213    -462.5471592786
+      3       0.4201       0.4330   -462.5472655227    -462.5471978288
+      4       0.4212       0.4220   -462.5472680211    -462.5472005230
+      5       0.4360       0.4370   -462.5472682637    -462.5472008834
+      6       0.4693       0.4720   -462.5472682941    -462.5472009359
+      7       0.4275       0.4280   -462.5472682967    -462.5472009418
+      8       0.4265       0.4270   -462.5472682970    -462.5472009427
+  The vectors            1  seem congerved : we take them out
+      9       0.4101       0.4100   -462.5472009427
+           1  -2.7170976579782291E-010
+ error in contraction
+     10       0.4104       0.4110   -462.5472009428
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.954792E-14    0.187704E-16
+        0.187704E-16    0.000000E+00
+
+ Energies :   -462.547268297014853    -462.547200942764505
+ E ss ref :     -3.037400959069607      -3.037333604819298
+ dE (a.u.):      0.000000000000000       0.000067354250309
+ dE (meV) :      0.000000000000000       1.832802520470590
+ |Hv-Ev|  :             6.0872E-06              4.6056E-06
+ deltaE   :            -2.7171E-10             -9.6171E-11
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+ Calculation finished in CPUtime             4.92s Walltime:             4.95s
+ Calculation finished on 07-12-2020 at 22:14
diff --git a/test/CuO_03450_nodet2/test b/test/CuO_03450_nodet2/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_03450_nodet2/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_nodet3/INPUT b/test/CuO_03450_nodet3/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..95342b0cffc14d25cbb45287e0c5c558dfb6b423
--- /dev/null
+++ b/test/CuO_03450_nodet3/INPUT
@@ -0,0 +1,43 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   iprintHmat = 0
+   nodet_block(3) = .true.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_03450_nodet3/cuo.TraInt b/test/CuO_03450_nodet3/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_nodet3/cuo.TraInt differ
diff --git a/test/CuO_03450_nodet3/cuo.TraOne b/test/CuO_03450_nodet3/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_nodet3/cuo.TraOne differ
diff --git a/test/CuO_03450_nodet3/cuo.ref0 b/test/CuO_03450_nodet3/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_nodet3/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_nodet3/result/cuo.out b/test/CuO_03450_nodet3/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..e80328050e353090a0ac2cd8e496dbe2637e3424
--- /dev/null
+++ b/test/CuO_03450_nodet3/result/cuo.out
@@ -0,0 +1,483 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 07-12-2020 at 22:22
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+ bdet :                                                                        cuo.bdet
+ sass :                                                                        cuo.sass
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+ bmat :                                                                        cuo.bmat
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :     480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Determinant block D2 was turned off by nodet_block input keyword
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         10960
+ >>>Determinants generated in   3.3093999999999998E-002 second(s)
+
+ >>> x_info written on file
+
+ >>> Determinants written on file
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.5219999999999982E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   4.3499999999999789E-004 second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.003301 second(s)  Wall time:    0.003000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+
+ <D00|H|D00> block of the Hamiltonian matrix
+        -2.1547630510452089     0.4071467349282018    -0.0011661827330583    -0.0015843635972472     0.0023734703309500     0.0000000000000000     0.0000361007291845     0.0000000000000000     0.0010476545529083     0.0000000000000000
+         0.4071467349282018    -2.1544585668705412     0.0011374786198633     0.0019175518851102     0.0000000000000000     0.0023734703309500     0.0000000000000000    -0.0000365697427802    -0.0057695230971876     0.0003201229112734
+        -0.0011661827330583     0.0011374786198633    -2.5612282257993875     0.0000000000000000     0.0019175518851102    -0.0015843635972472    -0.0001218490048947     0.0000491785329300    -0.0064970547388225     0.0000000000000000
+        -0.0015843635972472     0.0019175518851102     0.0000000000000000    -2.5612282257993875     0.0011374786198633    -0.0011661827330583     0.0000491785329300    -0.0001218490048947     0.0000000000000000    -0.0064970547388225
+         0.0023734703309500     0.0000000000000000     0.0019175518851102     0.0011374786198633    -2.1544585668705412     0.4071467349282018    -0.0000365697427802     0.0000000000000000     0.0003201229112734    -0.0057695230971876
+         0.0000000000000000     0.0023734703309500    -0.0015843635972472    -0.0011661827330583     0.4071467349282018    -2.1547630510452089     0.0000000000000000     0.0000361007291845     0.0000000000000000     0.0010476545529083
+         0.0000361007291845     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0000365697427802     0.0000000000000000    -2.6282995203255211     0.4071467349282018     0.0043610372579453     0.0043610619802855
+         0.0000000000000000    -0.0000365697427802     0.0000491785329300    -0.0001218490048947     0.0000000000000000     0.0000361007291845     0.4071467349282018    -2.6282995203255215     0.0043610619802855     0.0043610372579453
+         0.0010476545529083    -0.0057695230971876    -0.0064970547388225     0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0043610372579453     0.0043610619802855    -2.5417396557075262     0.0015843635972472
+         0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0064970547388225    -0.0057695230971876     0.0010476545529083     0.0043610619802855     0.0043610372579453     0.0015843635972472    -2.5417396557075267
+        -0.0006131819477916     0.0032677508563468     0.0036968202669343     0.0000000000000000     0.0000000000000000     0.0001841125372042     0.0004697137488920     0.0004697813153107    -0.0325751993364660    -0.0006592015415139
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0036968202669343     0.0032677508563468    -0.0006131819477916     0.0004697813153107     0.0004697137488920    -0.0006592015415139    -0.0325751993364660
+         0.0000120738777536     0.0004697137488920     0.0000000000000000     0.0009965899166763     0.0005389500455378     0.0000000000000000     0.0006132407390550     0.0006131819477916    -0.0028000248843868    -0.0001744684336959
+         0.0000000000000000     0.0005389500455378     0.0009965899166763     0.0000000000000000     0.0004697137488920     0.0000120738777536     0.0006131819477916     0.0006132407390550    -0.0001744684336959    -0.0028000248843868
+         0.0256599488464450     0.0251076560274124     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000     0.0000240082573146    -0.0029985015753972     0.0018640591165045     0.0001841125372042
+         0.0000000000000000     0.0000000000000000    -0.0006592015415139     0.0001069087224813     0.0251076560274124     0.0256599488464450    -0.0029985015753972     0.0000240082573146     0.0001841125372042     0.0018640591165045
+         0.0006131819477916     0.0017482055185013     0.0013191361079138     0.0000000000000000     0.0000000000000000    -0.0001841125372042     0.0000000000000000     0.0005389500455378     0.0001069087224813     0.0000000000000000
+        -0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0013191361079138     0.0017482055185013     0.0006131819477916     0.0005389500455378     0.0000000000000000     0.0000000000000000     0.0001069087224813
+        -0.0043610619802855     0.0069141002392945     0.0000000000000000     0.0118806995968195     0.0000000000000000    -0.0006055373772395    -0.0057695230971876    -0.0057694833032892     0.0000000000000000    -0.0001218490048947
+        -0.0006055373772395     0.0000000000000000     0.0118806995968195     0.0000000000000000     0.0069141002392945    -0.0043610619802855    -0.0057694833032892    -0.0057695230971876    -0.0001218490048947     0.0000000000000000
+        -0.0033610014536205    -0.0057695230971876    -0.0020883987322937     0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0006055373772395     0.0000000000000000    -0.0011661827330583     0.0000000000000000
+         0.0000000000000000     0.0003201229112734     0.0000000000000000    -0.0020883987322937    -0.0057695230971876    -0.0033610014536205     0.0000000000000000    -0.0006055373772395     0.0000000000000000    -0.0011661827330583
+        -0.0766362282479228    -0.0760839354288902    -0.0001069087224813     0.0006592015415139     0.0000000000000000     0.0000000000000000    -0.0029985015753972    -0.0000240082573146    -0.0006131819477916     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813    -0.0760839354288902    -0.0766362282479228    -0.0000240082573146    -0.0029985015753972     0.0000000000000000    -0.0006131819477916
+        -0.0025152336735863     0.0000000000000000     0.0001218490048947    -0.0000491785329300    -0.0024425632016216     0.0000000000000000     0.0023734703309500     0.0000000000000000     0.0006055373772395     0.0000000000000000
+         0.0000000000000000    -0.0024425632016216    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0025152336735863     0.0000000000000000     0.0023734703309500     0.0000000000000000     0.0006055373772395
+         0.0043610619802855    -0.0039799338629701     0.0000000000000000    -0.0089465332204950     0.0000000000000000     0.0006055373772395     0.0000000000000000     0.0003201229112734     0.0000491785329300    -0.0005921137406156
+         0.0006055373772395     0.0000000000000000    -0.0089465332204950     0.0000000000000000    -0.0039799338629701     0.0043610619802855     0.0003201229112734     0.0000000000000000    -0.0005921137406156     0.0000491785329300
+         0.0089617123396187     0.0004697137488920     0.0000000000000000    -0.0079530485451888     0.0005389500455378     0.0000000000000000     0.0001841125372042     0.0000000000000000     0.0001744684336959    -0.0000240082573146
+         0.0000000000000000     0.0005389500455378    -0.0079530485451888     0.0000000000000000     0.0004697137488920     0.0089617123396187     0.0000000000000000     0.0001841125372042    -0.0000240082573146     0.0001744684336959
+        -0.0000240082573146    -0.0029985015753972    -0.0001744684336959    -0.0001744684336959    -0.0029985015753972    -0.0000240082573146     0.0488408974744276     0.0488408974744276     0.0014159377081494     0.0014159377081494
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972    -0.0529029868009075    -0.0529029868009075     0.0004697137488920     0.0004697137488920
+         0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104     0.0001744684336959     0.0001069087224813     0.0001069087224813     0.0000000000000000     0.0000000000000000
+         0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104     0.0001744684336959    -0.0006592015415139    -0.0006592015415139     0.0093810601310918     0.0093810601310918
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0000000000000000     0.0005389500455378     0.0005389500455378
+        -0.0000240082573146    -0.0029985015753972    -0.0001744684336959    -0.0001744684336959    -0.0029985015753972    -0.0000240082573146     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+
+        -0.0006131819477916     0.0001841125372042     0.0000120738777536     0.0000000000000000     0.0256599488464450     0.0000000000000000     0.0006131819477916    -0.0001841125372042    -0.0043610619802855    -0.0006055373772395
+         0.0032677508563468     0.0000000000000000     0.0004697137488920     0.0005389500455378     0.0251076560274124     0.0000000000000000     0.0017482055185013     0.0000000000000000     0.0069141002392945     0.0000000000000000
+         0.0036968202669343     0.0000000000000000     0.0000000000000000     0.0009965899166763     0.0001069087224813    -0.0006592015415139     0.0013191361079138     0.0000000000000000     0.0000000000000000     0.0118806995968195
+         0.0000000000000000     0.0036968202669343     0.0009965899166763     0.0000000000000000    -0.0006592015415139     0.0001069087224813     0.0000000000000000     0.0013191361079138     0.0118806995968195     0.0000000000000000
+         0.0000000000000000     0.0032677508563468     0.0005389500455378     0.0004697137488920     0.0000000000000000     0.0251076560274124     0.0000000000000000     0.0017482055185013     0.0000000000000000     0.0069141002392945
+         0.0001841125372042    -0.0006131819477916     0.0000000000000000     0.0000120738777536     0.0000000000000000     0.0256599488464450    -0.0001841125372042     0.0006131819477916    -0.0006055373772395    -0.0043610619802855
+         0.0004697137488920     0.0004697813153107     0.0006132407390550     0.0006131819477916     0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0005389500455378    -0.0057695230971876    -0.0057694833032892
+         0.0004697813153107     0.0004697137488920     0.0006131819477916     0.0006132407390550    -0.0029985015753972     0.0000240082573146     0.0005389500455378     0.0000000000000000    -0.0057694833032892    -0.0057695230971876
+        -0.0325751993364660    -0.0006592015415139    -0.0028000248843868    -0.0001744684336959     0.0018640591165045     0.0001841125372042     0.0001069087224813     0.0000000000000000     0.0000000000000000    -0.0001218490048947
+        -0.0006592015415139    -0.0325751993364660    -0.0001744684336959    -0.0028000248843868     0.0001841125372042     0.0018640591165045     0.0000000000000000     0.0001069087224813    -0.0001218490048947     0.0000000000000000
+        -2.5286086870670714     0.0019175518851102     0.0000000000000000     0.0000491785329300    -0.0057695230971876     0.0000000000000000     0.0011374786198633     0.0000000000000000    -0.0028000248843868     0.0001984766910104
+         0.0019175518851102    -2.5286086870670714     0.0000491785329300     0.0000000000000000     0.0000000000000000    -0.0057695230971876     0.0000000000000000     0.0011374786198633     0.0001984766910104    -0.0028000248843868
+         0.0000000000000000     0.0000491785329300    -2.3044098187887054     0.0011661827330583     0.0069437102765272    -0.0006055373772395    -0.0001218490048947    -0.0026432424922423     0.0047798685629708     0.0001069087224813
+         0.0000491785329300     0.0000000000000000     0.0011661827330583    -2.3044098187887054    -0.0006055373772395     0.0069437102765272    -0.0026432424922423    -0.0001218490048947     0.0001069087224813     0.0047798685629708
+        -0.0057695230971876     0.0000000000000000     0.0069437102765272    -0.0006055373772395    -2.1570441077522013     0.0023734703309500    -0.0030999602738745     0.0003201229112734     0.0004697137488920     0.0000000000000000
+         0.0000000000000000    -0.0057695230971876    -0.0006055373772395     0.0069437102765272     0.0023734703309500    -2.1570441077522013     0.0003201229112734    -0.0030999602738745     0.0000000000000000     0.0004697137488920
+         0.0011374786198633     0.0000000000000000    -0.0001218490048947    -0.0026432424922423    -0.0030999602738745     0.0003201229112734    -1.7556658823452174     0.0019175518851102     0.0001984766910104     0.0000240082573146
+         0.0000000000000000     0.0011374786198633    -0.0026432424922423    -0.0001218490048947     0.0003201229112734    -0.0030999602738745     0.0019175518851102    -1.7556658823452174     0.0000240082573146     0.0001984766910104
+        -0.0028000248843868     0.0001984766910104     0.0047798685629708     0.0001069087224813     0.0004697137488920     0.0000000000000000     0.0001984766910104     0.0000240082573146    -2.2933565154552094     0.0011374786198633
+         0.0001984766910104    -0.0028000248843868     0.0001069087224813     0.0047798685629708     0.0000000000000000     0.0004697137488920     0.0000240082573146     0.0001984766910104     0.0011374786198633    -2.2933565154552094
+        -0.0001069087224813     0.0000000000000000     0.0001744684336959    -0.0000240082573146     0.0006131819477916     0.0000000000000000    -0.0184010800650118     0.0006592015415139    -0.0000491785329300    -0.0018870192037862
+         0.0000000000000000    -0.0001069087224813    -0.0000240082573146     0.0001744684336959     0.0000000000000000     0.0006131819477916     0.0006592015415139    -0.0184010800650118    -0.0018870192037862    -0.0000491785329300
+         0.0013086957326543     0.0003201229112734    -0.0043610619802855     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0057695230971876     0.0000000000000000     0.0009582302705923     0.0005389500455378
+         0.0003201229112734     0.0013086957326543     0.0000000000000000    -0.0043610619802855     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0057695230971876     0.0005389500455378     0.0009582302705923
+         0.0000000000000000     0.0005389500455378    -0.0001841125372042     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0004697137488920    -0.0084798571465544     0.0000000000000000     0.0003201229112734
+         0.0005389500455378     0.0000000000000000     0.0000000000000000    -0.0001841125372042    -0.0000240082573146    -0.0029985015753972    -0.0084798571465544     0.0004697137488920     0.0003201229112734     0.0000000000000000
+         0.0001984766910104     0.0000240082573146    -0.0006592015415139     0.0000000000000000     0.0099078687324574     0.0005389500455378    -0.0028000248843868     0.0001984766910104     0.0019175518851102     0.0000000000000000
+         0.0000240082573146     0.0001984766910104     0.0000000000000000    -0.0006592015415139     0.0005389500455378     0.0099078687324574     0.0001984766910104    -0.0028000248843868     0.0000000000000000     0.0019175518851102
+         0.0001218490048947     0.0001641095478405    -0.0015843635972472     0.0000000000000000     0.0043610619802855     0.0000000000000000     0.0000000000000000    -0.0000491785329300     0.0006592015415139     0.0000000000000000
+         0.0001641095478405     0.0001218490048947     0.0000000000000000    -0.0015843635972472     0.0000000000000000     0.0043610619802855    -0.0000491785329300     0.0000000000000000     0.0000000000000000     0.0006592015415139
+         0.0043610619802855     0.0043610619802855    -0.0055084421235432    -0.0055084421235432    -0.0007201225592716    -0.0007201225592716    -0.0006055373772395    -0.0006055373772395     0.0006131819477916     0.0006131819477916
+         0.0043314272207127     0.0043314272207127    -0.0057695230971876    -0.0057695230971876     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0020169324788974     0.0020169324788974
+         0.0000000000000000     0.0000000000000000    -0.0023723888383412    -0.0023723888383412    -0.0001218490048947    -0.0001218490048947     0.0144633726154013     0.0144633726154013     0.0000683177304644     0.0000683177304644
+        -0.0115292062390769    -0.0115292062390769     0.0000000000000000     0.0000000000000000     0.0000491785329300     0.0000491785329300     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0003201229112734    -0.0031987864900777    -0.0031987864900777    -0.0013972608443882    -0.0013972608443882     0.0000000000000000     0.0000000000000000
+         0.0006055373772395     0.0006055373772395     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000    -0.0043610619802855    -0.0043610619802855    -0.0001841125372042    -0.0001841125372042
+
+        -0.0033610014536205     0.0000000000000000    -0.0766362282479228     0.0000000000000000    -0.0025152336735863     0.0000000000000000     0.0043610619802855     0.0006055373772395     0.0089617123396187     0.0000000000000000
+        -0.0057695230971876     0.0003201229112734    -0.0760839354288902     0.0000000000000000     0.0000000000000000    -0.0024425632016216    -0.0039799338629701     0.0000000000000000     0.0004697137488920     0.0005389500455378
+        -0.0020883987322937     0.0000000000000000    -0.0001069087224813     0.0006592015415139     0.0001218490048947    -0.0000491785329300     0.0000000000000000    -0.0089465332204950     0.0000000000000000    -0.0079530485451888
+         0.0000000000000000    -0.0020883987322937     0.0006592015415139    -0.0001069087224813    -0.0000491785329300     0.0001218490048947    -0.0089465332204950     0.0000000000000000    -0.0079530485451888     0.0000000000000000
+         0.0003201229112734    -0.0057695230971876     0.0000000000000000    -0.0760839354288902    -0.0024425632016216     0.0000000000000000     0.0000000000000000    -0.0039799338629701     0.0005389500455378     0.0004697137488920
+         0.0000000000000000    -0.0033610014536205     0.0000000000000000    -0.0766362282479228     0.0000000000000000    -0.0025152336735863     0.0006055373772395     0.0043610619802855     0.0000000000000000     0.0089617123396187
+        -0.0006055373772395     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0023734703309500     0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0001841125372042     0.0000000000000000
+         0.0000000000000000    -0.0006055373772395    -0.0000240082573146    -0.0029985015753972     0.0000000000000000     0.0023734703309500     0.0003201229112734     0.0000000000000000     0.0000000000000000     0.0001841125372042
+        -0.0011661827330583     0.0000000000000000    -0.0006131819477916     0.0000000000000000     0.0006055373772395     0.0000000000000000     0.0000491785329300    -0.0005921137406156     0.0001744684336959    -0.0000240082573146
+         0.0000000000000000    -0.0011661827330583     0.0000000000000000    -0.0006131819477916     0.0000000000000000     0.0006055373772395    -0.0005921137406156     0.0000491785329300    -0.0000240082573146     0.0001744684336959
+        -0.0001069087224813     0.0000000000000000     0.0013086957326543     0.0003201229112734     0.0000000000000000     0.0005389500455378     0.0001984766910104     0.0000240082573146     0.0001218490048947     0.0001641095478405
+         0.0000000000000000    -0.0001069087224813     0.0003201229112734     0.0013086957326543     0.0005389500455378     0.0000000000000000     0.0000240082573146     0.0001984766910104     0.0001641095478405     0.0001218490048947
+         0.0001744684336959    -0.0000240082573146    -0.0043610619802855     0.0000000000000000    -0.0001841125372042     0.0000000000000000    -0.0006592015415139     0.0000000000000000    -0.0015843635972472     0.0000000000000000
+        -0.0000240082573146     0.0001744684336959     0.0000000000000000    -0.0043610619802855     0.0000000000000000    -0.0001841125372042     0.0000000000000000    -0.0006592015415139     0.0000000000000000    -0.0015843635972472
+         0.0006131819477916     0.0000000000000000     0.4071467349282018     0.0000000000000000    -0.0029985015753972    -0.0000240082573146     0.0099078687324574     0.0005389500455378     0.0043610619802855     0.0000000000000000
+         0.0000000000000000     0.0006131819477916     0.0000000000000000     0.4071467349282018    -0.0000240082573146    -0.0029985015753972     0.0005389500455378     0.0099078687324574     0.0000000000000000     0.0043610619802855
+        -0.0184010800650118     0.0006592015415139    -0.0057695230971876     0.0000000000000000     0.0004697137488920    -0.0084798571465544    -0.0028000248843868     0.0001984766910104     0.0000000000000000    -0.0000491785329300
+         0.0006592015415139    -0.0184010800650118     0.0000000000000000    -0.0057695230971876    -0.0084798571465544     0.0004697137488920     0.0001984766910104    -0.0028000248843868    -0.0000491785329300     0.0000000000000000
+        -0.0000491785329300    -0.0018870192037862     0.0009582302705923     0.0005389500455378     0.0000000000000000     0.0003201229112734     0.0019175518851102     0.0000000000000000     0.0006592015415139     0.0000000000000000
+        -0.0018870192037862    -0.0000491785329300     0.0005389500455378     0.0009582302705923     0.0003201229112734     0.0000000000000000     0.0000000000000000     0.0019175518851102     0.0000000000000000     0.0006592015415139
+        -1.7381940045445994     0.0015843635972472     0.0031518972583437    -0.0001841125372042    -0.0014268708816209    -0.0043610619802855     0.0000000000000000     0.0001218490048947    -0.0028000248843868    -0.0001744684336959
+         0.0015843635972472    -1.7381940045446000    -0.0001841125372042     0.0031518972583437    -0.0043610619802855    -0.0014268708816209     0.0001218490048947     0.0000000000000000    -0.0001744684336959    -0.0028000248843868
+         0.0031518972583437    -0.0001841125372042    -2.1264412613111281     0.0023734703309500     0.0000240082573146    -0.0029985015753972     0.0004697137488920     0.0000000000000000    -0.0040095439002027     0.0006055373772395
+        -0.0001841125372042     0.0031518972583437     0.0023734703309500    -2.1264412613111281    -0.0029985015753972     0.0000240082573146     0.0000000000000000     0.0004697137488920     0.0006055373772395    -0.0040095439002027
+        -0.0014268708816209    -0.0043610619802855     0.0000240082573146    -0.0029985015753972    -1.3892104983684459     0.4071467349282018    -0.0057695230971876    -0.0013608272967604     0.0044027156357931    -0.0006131819477916
+        -0.0043610619802855    -0.0014268708816209    -0.0029985015753972     0.0000240082573146     0.4071467349282018    -1.3892104983684466    -0.0013608272967604    -0.0057695230971876    -0.0006131819477916     0.0044027156357931
+         0.0000000000000000     0.0001218490048947     0.0004697137488920     0.0000000000000000    -0.0057695230971876    -0.0013608272967604    -1.8578131446610602     0.0011374786198633    -0.0557561479644486    -0.0001069087224813
+         0.0001218490048947     0.0000000000000000     0.0000000000000000     0.0004697137488920    -0.0013608272967604    -0.0057695230971876     0.0011374786198633    -1.8578131446610597    -0.0001069087224813    -0.0557561479644486
+        -0.0028000248843868    -0.0001744684336959    -0.0040095439002027     0.0006055373772395     0.0044027156357931    -0.0006131819477916    -0.0557561479644486    -0.0001069087224813    -1.8382636015534830     0.0011661827330583
+        -0.0001744684336959    -0.0028000248843868     0.0006055373772395    -0.0040095439002027    -0.0006131819477916     0.0044027156357931    -0.0001069087224813    -0.0557561479644486     0.0011661827330583    -1.8382636015534832
+         0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0001841125372042     0.0001841125372042     0.0000000000000000     0.0000000000000000
+         0.0005389500455378     0.0005389500455378     0.0007196535456759     0.0007196535456759     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0003201229112734     0.0003201229112734
+         0.0004314216692267     0.0004314216692267    -0.0000491785329300    -0.0000491785329300     0.0006592015415139     0.0006592015415139     0.0000000000000000     0.0000000000000000     0.0000000000000000     0.0000000000000000
+         0.0000000000000000     0.0000000000000000     0.0001218490048947     0.0001218490048947    -0.0001069087224813    -0.0001069087224813     0.0049476386443837     0.0049476386443837     0.0020362671681876     0.0020362671681876
+         0.0004697137488920     0.0004697137488920     0.0000000000000000     0.0000000000000000     0.0019267073994297     0.0019267073994297     0.0029990238959507     0.0029990238959507    -0.0057695230971876    -0.0057695230971876
+        -0.0075337007537157    -0.0075337007537157    -0.0017590103851302    -0.0017590103851302    -0.0998171768759054    -0.0998171768759054    -0.0006131819477916    -0.0006131819477916    -0.0010997861170144    -0.0010997861170144
+
+        -0.0000240082573146    -0.0029985015753972     0.0001744684336959     0.0001744684336959    -0.0029985015753972    -0.0000240082573146
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972
+        -0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104    -0.0001744684336959
+        -0.0001744684336959     0.0001984766910104    -0.0028000248843868    -0.0028000248843868     0.0001984766910104    -0.0001744684336959
+        -0.0029985015753972     0.0000240082573146     0.0001984766910104     0.0001984766910104     0.0000240082573146    -0.0029985015753972
+        -0.0000240082573146    -0.0029985015753972     0.0001744684336959     0.0001744684336959    -0.0029985015753972    -0.0000240082573146
+         0.0488408974744276    -0.0529029868009075     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000
+         0.0488408974744276    -0.0529029868009075     0.0001069087224813    -0.0006592015415139     0.0000000000000000     0.0000000000000000
+         0.0014159377081494     0.0004697137488920     0.0000000000000000     0.0093810601310918     0.0005389500455378     0.0000000000000000
+         0.0014159377081494     0.0004697137488920     0.0000000000000000     0.0093810601310918     0.0005389500455378     0.0000000000000000
+         0.0043610619802855     0.0043314272207127     0.0000000000000000    -0.0115292062390769     0.0000000000000000     0.0006055373772395
+         0.0043610619802855     0.0043314272207127     0.0000000000000000    -0.0115292062390769     0.0000000000000000     0.0006055373772395
+        -0.0055084421235432    -0.0057695230971876    -0.0023723888383412     0.0000000000000000     0.0003201229112734     0.0000000000000000
+        -0.0055084421235432    -0.0057695230971876    -0.0023723888383412     0.0000000000000000     0.0003201229112734     0.0000000000000000
+        -0.0007201225592716     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0031987864900777     0.0000000000000000
+        -0.0007201225592716     0.0000000000000000    -0.0001218490048947     0.0000491785329300    -0.0031987864900777     0.0000000000000000
+        -0.0006055373772395     0.0000000000000000     0.0144633726154013     0.0000000000000000    -0.0013972608443882    -0.0043610619802855
+        -0.0006055373772395     0.0000000000000000     0.0144633726154013     0.0000000000000000    -0.0013972608443882    -0.0043610619802855
+         0.0006131819477916     0.0020169324788974     0.0000683177304644     0.0000000000000000     0.0000000000000000    -0.0001841125372042
+         0.0006131819477916     0.0020169324788974     0.0000683177304644     0.0000000000000000     0.0000000000000000    -0.0001841125372042
+         0.0000000000000000     0.0005389500455378     0.0004314216692267     0.0000000000000000     0.0004697137488920    -0.0075337007537157
+         0.0000000000000000     0.0005389500455378     0.0004314216692267     0.0000000000000000     0.0004697137488920    -0.0075337007537157
+         0.0000000000000000     0.0007196535456759    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0017590103851302
+         0.0000000000000000     0.0007196535456759    -0.0000491785329300     0.0001218490048947     0.0000000000000000    -0.0017590103851302
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813     0.0019267073994297    -0.0998171768759054
+         0.0000000000000000     0.0000000000000000     0.0006592015415139    -0.0001069087224813     0.0019267073994297    -0.0998171768759054
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0049476386443837     0.0029990238959507    -0.0006131819477916
+         0.0001841125372042     0.0000000000000000     0.0000000000000000     0.0049476386443837     0.0029990238959507    -0.0006131819477916
+         0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0020362671681876    -0.0057695230971876    -0.0010997861170144
+         0.0000000000000000     0.0003201229112734     0.0000000000000000     0.0020362671681876    -0.0057695230971876    -0.0010997861170144
+        -2.6241620025653924     0.4071467349282018     0.0011661827330583     0.0015843635972472     0.0023734703309500     0.0000000000000000
+         0.4071467349282018    -2.6067007892332303     0.0011374786198633     0.0019175518851102     0.0000000000000000     0.0023734703309500
+         0.0011661827330583     0.0011374786198633    -1.5486000184195474     0.0000000000000000     0.0019175518851102     0.0015843635972472
+         0.0015843635972472     0.0019175518851102     0.0000000000000000    -1.8859994523472516     0.0011374786198633     0.0011661827330583
+         0.0023734703309500     0.0000000000000000     0.0019175518851102     0.0011374786198633    -1.3982146137172276     0.4071467349282018
+         0.0000000000000000     0.0023734703309500     0.0015843635972472     0.0011661827330583     0.4071467349282018    -1.3544701341672443
+
+ Eigenvalues of the D00-D00 Matrix
+  1  -462.5453567367527512
+  2  -462.5452843057054793
+  3  -462.0809683040457116
+  4  -462.0790176130660711
+  5  -462.0769058933238966
+  6  -462.0756069042187164
+  7  -462.0706931299682196
+  8  -462.0702641726454658
+  9  -462.0696254192293964
+  10  -462.0688970804107498
+  11  -462.0125572006065795
+  12  -462.0085863490550082
+  13  -461.8168292866441220
+  14  -461.8162470136301749
+  15  -461.8019372134087916
+  16  -461.8008678923476396
+  17  -461.7219252276019006
+  18  -461.7111541632574472
+  19  -461.4162024419536010
+  20  -461.4156014605839005
+  21  -461.3926897818469683
+  22  -461.3129862112451178
+  23  -461.3120983413513727
+  24  -461.3005977770960726
+  25  -461.2984584179386047
+  26  -461.2970430800617123
+  27  -461.2947906439143253
+  28  -461.2757125623879801
+  29  -461.2736214154912773
+  30  -461.2391577801855078
+  31  -461.2367947928008221
+  32  -461.1920697706506758
+  33  -461.1877085388319415
+  34  -461.0564044231625189
+  35  -460.5785719306652481
+  36  -460.3791309835817174
+ >>> H0 diagonalised in   9.1600000000000015E-004 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+Total Elapsed tWall       0.0550s
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.1969       0.1970   -462.5452856260    -462.5452132936
+      2       0.1788       0.1790   -462.5466623379    -462.5465917849
+      3       0.1793       0.1810   -462.5467054714    -462.5466377490
+      4       0.1709       0.1720   -462.5467083708    -462.5466407454
+      5       0.1734       0.1740   -462.5467088203    -462.5466411912
+      6       0.1709       0.1710   -462.5467088614    -462.5466412440
+      7       0.1709       0.1720   -462.5467088651    -462.5466412502
+      8       0.1803       0.1820   -462.5467088657    -462.5466412512
+  The vectors            1  seem congerved : we take them out
+      9       0.1675       0.1680   -462.5466412512
+           1  -5.4469273536028595E-010
+ error in contraction
+     10       0.1669       0.1670   -462.5466412513
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.133227E-14   -0.530381E-16
+       -0.530381E-16   -0.266454E-14
+
+ Energies :   -462.546708865650885    -462.546641251280221
+ E ss ref :     -3.036841527705689      -3.036773913335011
+ dE (a.u.):      0.000000000000000       0.000067614370677
+ dE (meV) :      0.000000000000000       1.839880756284377
+ |Hv-Ev|  :             8.5559E-06              5.0072E-06
+ deltaE   :            -5.4469E-10             -1.0958E-10
+
+ Maximum precision expected on |Hv-Ev|   :  0.3D-07
+ Maximum precision expected on <v|H|v>-E :  0.1D-14
+
+ Calculation finished in CPUtime             2.05s Walltime:             2.07s
+ Calculation finished on 07-12-2020 at 22:22
diff --git a/test/CuO_03450_nodet3/test b/test/CuO_03450_nodet3/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_03450_nodet3/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_smallbatch_MPIload/INPUT b/test/CuO_03450_smallbatch_MPIload/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..7b82faf4894280a413d39324f2af450a7fa668d7
--- /dev/null
+++ b/test/CuO_03450_smallbatch_MPIload/INPUT
@@ -0,0 +1,44 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   sizebatch = 3
+   mpi_load_balance = .true.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+  SizeheffDavidson = 10,
+  tol_conv = 1.d-10,
+  NiterDavidson = 12
+ &end
+
diff --git a/test/CuO_03450_smallbatch_MPIload/cuo.TraInt b/test/CuO_03450_smallbatch_MPIload/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_smallbatch_MPIload/cuo.TraInt differ
diff --git a/test/CuO_03450_smallbatch_MPIload/cuo.TraOne b/test/CuO_03450_smallbatch_MPIload/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_smallbatch_MPIload/cuo.TraOne differ
diff --git a/test/CuO_03450_smallbatch_MPIload/cuo.ref0 b/test/CuO_03450_smallbatch_MPIload/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_smallbatch_MPIload/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_smallbatch_MPIload/result/cuo.out b/test/CuO_03450_smallbatch_MPIload/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..43540733309475dd07fd7d8afeb47dcae4aead90
--- /dev/null
+++ b/test/CuO_03450_smallbatch_MPIload/result/cuo.out
@@ -0,0 +1,294 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:09
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :  480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in  0.17599999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000036E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.020000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       2.4760       2.5690   -462.5452856260    -462.5452132936
+      2       2.1960       2.2140   -462.5473438544    -462.5472729767
+      3       2.2160       2.2240   -462.5473910781    -462.5473230881
+      4       2.3720       2.3810   -462.5473944973    -462.5473266520
+      5       2.2000       2.2080   -462.5473949684    -462.5473271286
+      6       2.2360       2.2470   -462.5473950180    -462.5473271905
+      7       2.2320       2.2420   -462.5473950222    -462.5473271979
+      8       2.2400       2.2490   -462.5473950228    -462.5473271988
+  The vectors            1  seem congerved : we take them out
+      9       2.2000       2.2110   -462.5473271988
+     10       2.1680       2.1780   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.188738E-14    0.126768E-15
+        0.126768E-15   -0.655032E-14
+
+ Energies :   -462.547395022798923    -462.547327198962932
+ E ss ref :     -3.037527684853703      -3.037459861017721
+ dE (a.u.):      0.000000000000000       0.000067823835982
+ dE (meV) :      0.000000000000000       1.845580597594530
+ |Hv-Ev|  :             9.1813E-06              5.3980E-06
+ deltaE   :            -5.7348E-10             -1.1886E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            25.36s Walltime:            26.04s
+ Calculation finished on 04-09-2019 at 15:09
diff --git a/test/CuO_03450_smallbatch_MPIload/test b/test/CuO_03450_smallbatch_MPIload/test
new file mode 100755
index 0000000000000000000000000000000000000000..0b28fa6c19ba9b31312ba94dcdfc1188e93eaf74
--- /dev/null
+++ b/test/CuO_03450_smallbatch_MPIload/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f}, mpi='mpirun -np 2 ')
+
+sys.exit(test.return_code)
diff --git a/test/CuO_03450_smallbatch_noMPIload/INPUT b/test/CuO_03450_smallbatch_noMPIload/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..bfa4ee046609ac23b2c01b98bf708ce428c16b10
--- /dev/null
+++ b/test/CuO_03450_smallbatch_noMPIload/INPUT
@@ -0,0 +1,44 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+   sizebatch = 3
+   mpi_load_balance = .false.
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 0, 
+   norb_ligo = 3, 
+   norb_act  = 4, 
+   norb_ligv = 5, 
+   norb_virt = 0, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+  SizeheffDavidson = 10,
+  tol_conv = 1.d-10,
+  NiterDavidson = 12
+ &end
+
diff --git a/test/CuO_03450_smallbatch_noMPIload/cuo.TraInt b/test/CuO_03450_smallbatch_noMPIload/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_03450_smallbatch_noMPIload/cuo.TraInt differ
diff --git a/test/CuO_03450_smallbatch_noMPIload/cuo.TraOne b/test/CuO_03450_smallbatch_noMPIload/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_03450_smallbatch_noMPIload/cuo.TraOne differ
diff --git a/test/CuO_03450_smallbatch_noMPIload/cuo.ref0 b/test/CuO_03450_smallbatch_noMPIload/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_03450_smallbatch_noMPIload/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_03450_smallbatch_noMPIload/result/cuo.out b/test/CuO_03450_smallbatch_noMPIload/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..43540733309475dd07fd7d8afeb47dcae4aead90
--- /dev/null
+++ b/test/CuO_03450_smallbatch_noMPIload/result/cuo.out
@@ -0,0 +1,294 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:09
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   0
+  Nbre d'orbitales lig. occ        :   3
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   5
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     0     3     4     5     0    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            0
+    Ligo   =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Virt   =            0
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 36
+  Nbre de det Ref1 ligo-> ligv + ech :  480
+  Ref1 Cas  -> Cas  :    1 ->     0
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                    15600
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     3000
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     5280
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      180
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      520
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         26560
+ >>>Determinants generated in  0.17599999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000036E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.020000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       2.4760       2.5690   -462.5452856260    -462.5452132936
+      2       2.1960       2.2140   -462.5473438544    -462.5472729767
+      3       2.2160       2.2240   -462.5473910781    -462.5473230881
+      4       2.3720       2.3810   -462.5473944973    -462.5473266520
+      5       2.2000       2.2080   -462.5473949684    -462.5473271286
+      6       2.2360       2.2470   -462.5473950180    -462.5473271905
+      7       2.2320       2.2420   -462.5473950222    -462.5473271979
+      8       2.2400       2.2490   -462.5473950228    -462.5473271988
+  The vectors            1  seem congerved : we take them out
+      9       2.2000       2.2110   -462.5473271988
+     10       2.1680       2.1780   -462.5473271990
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   10  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            9  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.188738E-14    0.126768E-15
+        0.126768E-15   -0.655032E-14
+
+ Energies :   -462.547395022798923    -462.547327198962932
+ E ss ref :     -3.037527684853703      -3.037459861017721
+ dE (a.u.):      0.000000000000000       0.000067823835982
+ dE (meV) :      0.000000000000000       1.845580597594530
+ |Hv-Ev|  :             9.1813E-06              5.3980E-06
+ deltaE   :            -5.7348E-10             -1.1886E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            25.36s Walltime:            26.04s
+ Calculation finished on 04-09-2019 at 15:09
diff --git a/test/CuO_03450_smallbatch_noMPIload/test b/test/CuO_03450_smallbatch_noMPIload/test
new file mode 100755
index 0000000000000000000000000000000000000000..0b28fa6c19ba9b31312ba94dcdfc1188e93eaf74
--- /dev/null
+++ b/test/CuO_03450_smallbatch_noMPIload/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-9)
+
+f.add(string = '|Hv-Ev|',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f}, mpi='mpirun -np 2 ')
+
+sys.exit(test.return_code)
diff --git a/test/CuO_12423/INPUT b/test/CuO_12423/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..362f0e86872906b543262ade62beb4915abf87e8
--- /dev/null
+++ b/test/CuO_12423/INPUT
@@ -0,0 +1,42 @@
+#
+# Test with all possible kinds of orbitals 
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   iprint=1 
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 1, 
+   norb_ligo = 2, 
+   norb_act  = 4, 
+   norb_ligv = 2, 
+   norb_virt = 3, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=19, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_12423/cuo.TraInt b/test/CuO_12423/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_12423/cuo.TraInt differ
diff --git a/test/CuO_12423/cuo.TraOne b/test/CuO_12423/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_12423/cuo.TraOne differ
diff --git a/test/CuO_12423/cuo.ref0 b/test/CuO_12423/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_12423/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_12423/result/cuo.out b/test/CuO_12423/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..6940c9e521c16f0487cef9a1b01e20dd0dacdf33
--- /dev/null
+++ b/test/CuO_12423/result/cuo.out
@@ -0,0 +1,991 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ DEBUG VersionT
+ Calculation started on 13-11-2019 at 17:10
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   1
+  Nbre d'orbitales lig. occ        :   2
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   2
+  Nbre d'orbitales virtuelles      :   3
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     1     2     4     2     3    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            1
+       Molcas    :      39
+       Molcas/ir :      39
+       SelS      :      39
+       SelS up   :      77
+       SelS dn   :      80
+    Ligo   =            2
+       Molcas    :      40     41
+       Molcas/ir :      40     41
+       SelS      :      40     41
+       SelS up   :      78     79
+       SelS dn   :      81     82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            2
+       Molcas    :      46     47
+       Molcas/ir :      46     47
+       SelS      :      46     47
+       SelS up   :      91     92
+       SelS dn   :      96     97
+    Virt   =            3
+       Molcas    :      48     49     50
+       Molcas/ir :      48     49     50
+       SelS      :      48     49     50
+       SelS up   :      93     94     95
+       SelS dn   :      98     99    100
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  19
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+   14   :    1100 1100 
+   15   :    1010 1010 
+   16   :    1001 1001 
+   17   :    0110 0110 
+   18   :    0101 0101 
+   19   :    0011 0011 
+
+ >>> Generation of all determinants
+  Ref0:     1  Couches fermees :   0 - 0000 0000  Ref0:     1  Couches ouvertes:   4 - 1111 0000
+  Ref0:     2  Couches fermees :   1 - 1000 0000  Ref0:     2  Couches ouvertes:   2 - 0110 0000
+  Ref0:     3  Couches fermees :   1 - 0100 0000  Ref0:     3  Couches ouvertes:   2 - 1010 0000
+  Ref0:     4  Couches fermees :   1 - 0010 0000  Ref0:     4  Couches ouvertes:   2 - 1100 0000
+  Ref0:     5  Couches fermees :   1 - 1000 0000  Ref0:     5  Couches ouvertes:   2 - 0101 0000
+  Ref0:     6  Couches fermees :   1 - 0100 0000  Ref0:     6  Couches ouvertes:   2 - 1001 0000
+  Ref0:     7  Couches fermees :   1 - 0001 0000  Ref0:     7  Couches ouvertes:   2 - 1100 0000
+  Ref0:     8  Couches fermees :   1 - 1000 0000  Ref0:     8  Couches ouvertes:   2 - 0011 0000
+  Ref0:     9  Couches fermees :   1 - 0001 0000  Ref0:     9  Couches ouvertes:   2 - 1010 0000
+  Ref0:    10  Couches fermees :   1 - 0010 0000  Ref0:    10  Couches ouvertes:   2 - 1001 0000
+  Ref0:    11  Couches fermees :   1 - 0001 0000  Ref0:    11  Couches ouvertes:   2 - 0110 0000
+  Ref0:    12  Couches fermees :   1 - 0100 0000  Ref0:    12  Couches ouvertes:   2 - 0011 0000
+  Ref0:    13  Couches fermees :   1 - 0010 0000  Ref0:    13  Couches ouvertes:   2 - 0101 0000
+  Ref0:    14  Couches fermees :   2 - 1100 0000  Ref0:    14  Couches ouvertes:   0 - 0000 0000
+  Ref0:    15  Couches fermees :   2 - 1010 0000  Ref0:    15  Couches ouvertes:   0 - 0000 0000
+  Ref0:    16  Couches fermees :   2 - 1001 0000  Ref0:    16  Couches ouvertes:   0 - 0000 0000
+  Ref0:    17  Couches fermees :   2 - 0110 0000  Ref0:    17  Couches ouvertes:   0 - 0000 0000
+  Ref0:    18  Couches fermees :   2 - 0101 0000  Ref0:    18  Couches ouvertes:   0 - 0000 0000
+  Ref0:    19  Couches fermees :   2 - 0011 0000  Ref0:    19  Couches ouvertes:   0 - 0000 0000
+
+  Nbre de conf d'espace unique : 19
+  Ref0 irr:     1  Couches fermees :   0 - 0000  Ref0 irr:     1  Couches ouvertes:   4 - 1111
+  Ref0 irr:     2  Couches fermees :   1 - 1000  Ref0 irr:     2  Couches ouvertes:   2 - 0110
+  Ref0 irr:     3  Couches fermees :   1 - 0100  Ref0 irr:     3  Couches ouvertes:   2 - 1010
+  Ref0 irr:     4  Couches fermees :   1 - 0010  Ref0 irr:     4  Couches ouvertes:   2 - 1100
+  Ref0 irr:     5  Couches fermees :   1 - 1000  Ref0 irr:     5  Couches ouvertes:   2 - 0101
+  Ref0 irr:     6  Couches fermees :   1 - 0100  Ref0 irr:     6  Couches ouvertes:   2 - 1001
+  Ref0 irr:     7  Couches fermees :   1 - 0001  Ref0 irr:     7  Couches ouvertes:   2 - 1100
+  Ref0 irr:     8  Couches fermees :   1 - 1000  Ref0 irr:     8  Couches ouvertes:   2 - 0011
+  Ref0 irr:     9  Couches fermees :   1 - 0001  Ref0 irr:     9  Couches ouvertes:   2 - 1010
+  Ref0 irr:    10  Couches fermees :   1 - 0010  Ref0 irr:    10  Couches ouvertes:   2 - 1001
+  Ref0 irr:    11  Couches fermees :   1 - 0001  Ref0 irr:    11  Couches ouvertes:   2 - 0110
+  Ref0 irr:    12  Couches fermees :   1 - 0100  Ref0 irr:    12  Couches ouvertes:   2 - 0011
+  Ref0 irr:    13  Couches fermees :   1 - 0010  Ref0 irr:    13  Couches ouvertes:   2 - 0101
+  Ref0 irr:    14  Couches fermees :   2 - 1100  Ref0 irr:    14  Couches ouvertes:   0 - 0000
+  Ref0 irr:    15  Couches fermees :   2 - 1010  Ref0 irr:    15  Couches ouvertes:   0 - 0000
+  Ref0 irr:    16  Couches fermees :   2 - 1001  Ref0 irr:    16  Couches ouvertes:   0 - 0000
+  Ref0 irr:    17  Couches fermees :   2 - 0110  Ref0 irr:    17  Couches ouvertes:   0 - 0000
+  Ref0 irr:    18  Couches fermees :   2 - 0101  Ref0 irr:    18  Couches ouvertes:   0 - 0000
+  Ref0 irr:    19  Couches fermees :   2 - 0011  Ref0 irr:    19  Couches ouvertes:   0 - 0000
+  Nbre de det Ref0 final : 36
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0011 1100
+0101 1010
+0110 1001
+1001 0110
+1010 0101
+1100 0011
+ Matrix to be diagonalised
+         2.000000     1.000000     1.000000     1.000000     1.000000     0.000000
+         1.000000     2.000000     1.000000     1.000000     0.000000     1.000000
+         1.000000     1.000000     2.000000     0.000000     1.000000     1.000000
+         1.000000     1.000000     0.000000     2.000000     1.000000     1.000000
+         1.000000     0.000000     1.000000     1.000000     2.000000     1.000000
+         0.000000     1.000000     1.000000     1.000000     1.000000     2.000000
+
+  Vecteurs propres
+
+  -0.000000   0.000000   2.000000   2.000000   2.000000   6.000000
+
+   0.000000   0.577350   0.000000   0.000000  -0.707107   0.408248
+   0.500000  -0.288675  -0.486671  -0.512982  -0.000000   0.408248
+  -0.500000  -0.288675  -0.512982   0.486671  -0.000000   0.408248
+  -0.500000  -0.288675   0.512982  -0.486671  -0.000000   0.408248
+   0.500000  -0.288675   0.486671   0.512982   0.000000   0.408248
+   0.000000   0.577350  -0.000000   0.000000   0.707107   0.408248
+    Valeurs pp de S2
+  -0.000000000000   0.000000000000   2.000000000000   2.000000000000   2.000000000000   6.000000000000
+
+    Nbre de conf S, Sz            2
+    0.000000    0.577350
+    0.500000   -0.288675
+   -0.500000   -0.288675
+   -0.500000   -0.288675
+    0.500000   -0.288675
+    0.000000    0.577350
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+  Ref0 finaux 
+    1   :   0011 1100
+    2   :   0101 1010
+    3   :   0110 1001
+    4   :   1001 0110
+    5   :   1010 0101
+    6   :   1100 0011
+    7   :   1010 1100
+    8   :   1100 1010
+    9   :   0110 1100
+   10   :   1100 0110
+   11   :   0110 1010
+   12   :   1010 0110
+   13   :   1001 1100
+   14   :   1100 1001
+   15   :   0101 1100
+   16   :   1100 0101
+   17   :   0101 1001
+   18   :   1001 0101
+   19   :   1001 1010
+   20   :   1010 1001
+   21   :   0011 1001
+   22   :   1001 0011
+   23   :   0011 1010
+   24   :   1010 0011
+   25   :   0011 0101
+   26   :   0101 0011
+   27   :   0101 0110
+   28   :   0110 0101
+   29   :   0011 0110
+   30   :   0110 0011
+   31   :   1100 1100
+   32   :   1010 1010
+   33   :   1001 1001
+   34   :   0110 0110
+   35   :   0101 0101
+   36   :   0011 0011
+  Nbre de det Ref1 (debug) : 3456
+  Nbre de det Ref1 CAS -> CAS :    0
+  Nbre de det Ref1 ligo-> CAS :   96
+  Nbre de det Ref1 CAS -> ligv:   96
+  Nbre de det Ref1 ligo-> ligv:  288
+  Nbre de det Ref1 ligo-> ligv + ech :  128
+  Nbre de det Ref1 ligo-> ligv tot:  416
+  Ref1 Cas  -> Cas  :    1 ->     0
+===
+Active determinant list R_-2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+===
+Active determinant list R_-1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_0
+Contains 70 determinants
+           0           2          -2           4          -4
+          36          16          16           1           1
+===
+Active determinant list R_1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                     9490
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     2760
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     3480
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      164
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      340
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                         18214
+ >>>Determinants generated in  0.11199999999999999      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  BSLbl = 
+    Irrep =  1
+         1  CU01  1s  
+         2  CU01  2px 
+         3  CU01  2px 
+         4  CU01  2py 
+         5  CU01  2py 
+         6  CU01  2pz 
+         7  CU01  2pz 
+         8  CU01  3d2-
+         9  CU01  3d2-
+        10  CU01  3d1-
+        11  CU01  3d1-
+        12  CU01  3d0 
+        13  CU01  3d0 
+        14  CU01  3d1+
+        15  CU01  3d1+
+        16  CU01  3d2+
+        17  CU01  3d2+
+        18  CU02  1s  
+        19  CU02  2px 
+        20  CU02  2px 
+        21  CU02  2py 
+        22  CU02  2py 
+        23  CU02  2pz 
+        24  CU02  2pz 
+        25  CU02  3d2-
+        26  CU02  3d2-
+        27  CU02  3d1-
+        28  CU02  3d1-
+        29  CU02  3d0 
+        30  CU02  3d0 
+        31  CU02  3d1+
+        32  CU02  3d1+
+        33  CU02  3d2+
+        34  CU02  3d2+
+        35  O_03  1s  
+        36  O_03  2px 
+        37  O_03  2px 
+        38  O_03  2py 
+        39  O_03  2py 
+        40  O_03  2pz 
+        41  O_03  2pz 
+        42  O_03  3d2-
+        43  O_03  3d1-
+        44  O_03  3d0 
+        45  O_03  3d1+
+        46  O_03  3d2+
+        47  O_04  1s  
+        48  O_04  2px 
+        49  O_04  2px 
+        50  O_04  2py 
+        51  O_04  2py 
+        52  O_04  2pz 
+        53  O_04  2pz 
+        54  O_04  3d2-
+        55  O_04  3d1-
+        56  O_04  3d0 
+        57  O_04  3d1+
+        58  O_04  3d2+
+        59  O_05  1s  
+        60  O_05  2px 
+        61  O_05  2px 
+        62  O_05  2py 
+        63  O_05  2py 
+        64  O_05  2pz 
+        65  O_05  2pz 
+        66  O_05  3d2-
+        67  O_05  3d1-
+        68  O_05  3d0 
+        69  O_05  3d1+
+        70  O_05  3d2+
+        71  O_06  1s  
+        72  O_06  2px 
+        73  O_06  2px 
+        74  O_06  2py 
+        75  O_06  2py 
+        76  O_06  2pz 
+        77  O_06  2pz 
+        78  O_06  3d2-
+        79  O_06  3d1-
+        80  O_06  3d0 
+        81  O_06  3d1+
+        82  O_06  3d2+
+        83  O_07  1s  
+        84  O_07  2px 
+        85  O_07  2px 
+        86  O_07  2py 
+        87  O_07  2py 
+        88  O_07  2pz 
+        89  O_07  2pz 
+        90  O_07  3d2-
+        91  O_07  3d1-
+        92  O_07  3d0 
+        93  O_07  3d1+
+        94  O_07  3d2+
+        95  O_08  1s  
+        96  O_08  2px 
+        97  O_08  2px 
+        98  O_08  2py 
+        99  O_08  2py 
+       100  O_08  2pz 
+       101  O_08  2pz 
+       102  O_08  3d2-
+       103  O_08  3d1-
+       104  O_08  3d0 
+       105  O_08  3d1+
+       106  O_08  3d2+
+       107  O_09  1s  
+       108  O_09  2px 
+       109  O_09  2px 
+       110  O_09  2py 
+       111  O_09  2py 
+       112  O_09  2pz 
+       113  O_09  2pz 
+       114  O_09  3d2-
+       115  O_09  3d1-
+       116  O_09  3d0 
+       117  O_09  3d1+
+       118  O_09  3d2+
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   8.0000000000000071E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.040000 second(s)  Wall time:    0.044000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   4.0000000000000036E-003 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+      vecteur d essai   2 de norme^2 1 + 0.199840E-14 a ete renormalise     
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+
+  Vecteurs propres
+
+  -3.035418  -3.035346
+
+  -1.000000   0.000000
+  -0.000000  -1.000000
+      1       4.1640       4.1680   -462.5452856260    -462.5452132936
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.709117   0.705091
+   0.705091   0.709117
+
+  Vecteurs propres
+
+  -3.036285  -3.036216  -2.034796  -2.029952
+
+  -0.999569  -0.000000   0.000000   0.029352
+  -0.000000   0.999566   0.029474  -0.000000
+   0.029352   0.000000   0.000000   0.999569
+   0.000000  -0.029474   0.999566  -0.000000
+      2       4.0600       4.0630   -462.5461526248    -462.5460832421
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707308  -0.706906
+  -0.706906   0.707308
+
+  Vecteurs propres
+
+  -3.036315  -3.036248  -2.138667  -2.134114  -1.989897  -1.982325
+
+  -0.999542   0.000000  -0.021099   0.000000   0.000000   0.021715
+  -0.000000  -0.999537  -0.000000  -0.021473   0.021545  -0.000000
+   0.029753  -0.000000  -0.551553  -0.000000   0.000000   0.833609
+   0.000000   0.029860   0.000000  -0.557581   0.829585  -0.000000
+   0.005612   0.000000  -0.833873  -0.000000  -0.000000  -0.551928
+  -0.000000  -0.005801  -0.000000   0.829845   0.557964  -0.000000
+      3       4.1040       4.1070   -462.5461822321    -462.5461149580
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.706990  -0.707224
+  -0.707224   0.706990
+
+  Vecteurs propres
+
+  -3.036317  -3.036249  -2.299886  -2.295762  -2.009925  -2.003308  -1.898246  -1.849495
+
+  -0.999536   0.000000  -0.014193   0.000000   0.000000   0.026927   0.000000  -0.000936
+  -0.000000  -0.999532  -0.000000  -0.014126  -0.027131   0.000000   0.000486  -0.000000
+   0.029840  -0.000000  -0.303210  -0.000000  -0.000000   0.950150  -0.000000   0.066242
+   0.000000   0.029948   0.000000  -0.300625  -0.948509  -0.000000  -0.095173  -0.000000
+   0.005922   0.000000  -0.724281  -0.000000   0.000000  -0.185012   0.000000  -0.664193
+  -0.000000  -0.006082  -0.000000   0.688686  -0.147233  -0.000000  -0.709928  -0.000000
+   0.001371   0.000000  -0.619095  -0.000000   0.000000  -0.249520  -0.000000   0.744620
+   0.000000   0.001407   0.000000  -0.659649   0.279135   0.000000  -0.697814  -0.000000
+      4       4.0760       4.0820   -462.5461840268    -462.5461167715
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.706975  -0.707238
+  -0.707238   0.706975
+
+  Vecteurs propres
+
+  -3.036317  -3.036250  -2.468563  -2.453244  -2.035395  -2.026927  -1.996249  -1.983967  -1.764210  -1.579237
+
+  -0.999534   0.000000   0.010914   0.000000   0.000000  -0.024207   0.000000  -0.015037  -0.000000   0.001064
+  -0.000000  -0.999530   0.000000  -0.010937  -0.022522  -0.000000  -0.017678  -0.000000   0.001022   0.000000
+   0.029890  -0.000000   0.221513  -0.000000  -0.000000  -0.737520  -0.000000  -0.634866  -0.000000   0.055212
+   0.000000   0.029994  -0.000000  -0.222224  -0.659532   0.000000  -0.714096   0.000000   0.069293   0.000000
+   0.006006   0.000000   0.486528  -0.000000  -0.000000  -0.474774   0.000000   0.703586   0.000000  -0.206910
+  -0.000000  -0.006161   0.000000   0.470857   0.548606  -0.000000  -0.624884   0.000000   0.294631   0.000000
+   0.001595   0.000000   0.677381  -0.000000   0.000000   0.308858  -0.000000  -0.064584  -0.000000   0.664520
+   0.000000   0.001591  -0.000000  -0.659017   0.241872  -0.000000   0.050692  -0.000000   0.710368   0.000000
+   0.000564   0.000000   0.505231  -0.000000   0.000000   0.366982  -0.000000  -0.312274   0.000000  -0.715927
+  -0.000000   0.000585  -0.000000  -0.542667   0.452814  -0.000000  -0.310973   0.000000  -0.635427  -0.000000
+      5       4.0800       4.0850   -462.5461843367    -462.5461170773
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707107  -0.707107
+  -0.707107   0.707107
+
+  Vecteurs propres
+
+  -3.036317  -3.036250  -2.539277  -2.526400  -2.066026  -2.052681  -2.021565  -1.998157  -1.996075  -1.871660
+
+  -0.999533  -0.000000  -0.009937   0.000000  -0.000000  -0.017923   0.000000   0.022572   0.000000   0.001957
+  -0.000000   0.999529  -0.000000  -0.009886   0.015199  -0.000000  -0.017860   0.000000  -0.017101   0.000000
+   0.029901   0.000000  -0.199434   0.000000  -0.000000  -0.475968   0.000000   0.847967   0.000000   0.112407
+   0.000000  -0.030006  -0.000000  -0.197295   0.401931  -0.000000  -0.558571   0.000000  -0.694113   0.000000
+   0.006029  -0.000000  -0.427256   0.000000  -0.000000  -0.684600   0.000000  -0.429569  -0.000000  -0.367424
+  -0.000000   0.006183   0.000000   0.408692  -0.545039   0.000000   0.273015   0.000000  -0.625157   0.000000
+   0.001629   0.000000  -0.616444   0.000000   0.000000   0.080081  -0.000000  -0.193607  -0.000000   0.551359
+   0.000000  -0.001645  -0.000000  -0.643456  -0.070330   0.000000   0.213025  -0.000000   0.043970   0.000000
+   0.000616   0.000000  -0.539688   0.000000   0.000000   0.406680  -0.000000   0.121040   0.000000   0.065182
+  -0.000000  -0.000613  -0.000000  -0.479965   0.053085   0.000000   0.572026   0.000000  -0.349548  -0.000000
+   0.000174   0.000000  -0.326058   0.000000   0.000000   0.364219   0.000000   0.209232   0.000000  -0.737641
+   0.000000  -0.000212  -0.000000  -0.386710  -0.730334   0.000000  -0.490458   0.000000   0.054552  -0.000000
+      6       4.0560       4.0620   -462.5461843679    -462.5461171169
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707123   0.707091
+   0.707091   0.707123
+
+  Vecteurs propres
+
+  -3.036317  -3.036250  -2.562969  -2.555903  -2.139728  -2.094938  -2.063517  -2.012960  -2.004031  -1.990687
+
+  -0.999533   0.000000  -0.009419   0.000000  -0.000000   0.012888  -0.000000   0.021325   0.000000  -0.014886
+  -0.000000  -0.999529  -0.000000  -0.009377   0.004128   0.000000   0.017499   0.000000  -0.022797  -0.000000
+   0.029902  -0.000000  -0.185746   0.000000  -0.000000   0.327211  -0.000000   0.683213   0.000000  -0.619379
+   0.000000   0.030008  -0.000000  -0.183638   0.103491   0.000000   0.465483   0.000000  -0.834108  -0.000000
+   0.006033   0.000000  -0.413472   0.000000  -0.000000   0.493749  -0.000000   0.279632  -0.000000   0.657491
+  -0.000000  -0.006191   0.000000   0.400038  -0.109809  -0.000000  -0.612248  -0.000000  -0.295216  -0.000000
+   0.001634  -0.000000  -0.588911   0.000000  -0.000000   0.210698   0.000000  -0.412735  -0.000000  -0.089044
+   0.000000   0.001647  -0.000000  -0.579820   0.366880   0.000000  -0.033425  -0.000000   0.281427  -0.000000
+   0.000621  -0.000000  -0.520711   0.000000   0.000000  -0.147231   0.000000  -0.307996  -0.000000  -0.321423
+  -0.000000   0.000632  -0.000000  -0.529124  -0.467815  -0.000000  -0.111594  -0.000000   0.056201  -0.000000
+   0.000187  -0.000000  -0.375456   0.000000   0.000000  -0.587374   0.000000   0.248841   0.000000   0.033972
+   0.000000   0.000218  -0.000000  -0.367250   0.369541  -0.000000  -0.619299   0.000000  -0.336377   0.000000
+   0.000050  -0.000000  -0.188489   0.000000   0.000000  -0.487751   0.000000   0.356984   0.000000   0.267315
+   0.000000  -0.000069   0.000000   0.234783   0.697999   0.000000   0.105213  -0.000000   0.145196  -0.000000
+      7       4.2680       4.2700   -462.5461843707    -462.5461171216
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707104  -0.707109
+  -0.707109   0.707104
+
+  Vecteurs propres
+
+  -3.036317  -3.036250  -2.574985  -2.571591  -2.241841  -2.190709  -2.137219  -2.041522  -2.035516  -2.000509
+
+   0.999533   0.000000  -0.008886   0.000000  -0.007461   0.000000   0.000000   0.016873  -0.000000   0.000000
+   0.000000  -0.999529  -0.000000  -0.008869  -0.000000   0.007055  -0.006623   0.000000   0.018786   0.020265
+  -0.029902  -0.000000  -0.171906   0.000000  -0.191310   0.000000   0.000000   0.444761  -0.000000   0.000000
+  -0.000000   0.030008  -0.000000  -0.170533  -0.000000   0.184254  -0.169388   0.000000   0.521115   0.788374
+  -0.006034   0.000000  -0.400096   0.000000  -0.208765   0.000000   0.000000   0.688676  -0.000000  -0.000000
+   0.000000  -0.006192   0.000000   0.385101   0.000000  -0.203732   0.184137  -0.000000  -0.624799   0.539222
+  -0.001635   0.000000  -0.564662   0.000000  -0.299958   0.000000   0.000000  -0.173318   0.000000  -0.000000
+  -0.000000   0.001650  -0.000000  -0.571844  -0.000000   0.085323  -0.396629  -0.000000  -0.293113  -0.116211
+  -0.000622  -0.000000  -0.505015   0.000000  -0.138577  -0.000000  -0.000000  -0.436908   0.000000   0.000000
+   0.000000   0.000631  -0.000000  -0.485375   0.000000   0.424466   0.389040  -0.000000  -0.347513   0.126016
+  -0.000189  -0.000000  -0.387301   0.000000   0.288108   0.000000  -0.000000  -0.238713   0.000000   0.000000
+  -0.000000   0.000223  -0.000000  -0.401442  -0.000000  -0.549605  -0.205590  -0.000000  -0.208392   0.229674
+  -0.000056   0.000000  -0.253756   0.000000   0.620060  -0.000000  -0.000000   0.123097  -0.000000   0.000000
+  -0.000000  -0.000073   0.000000   0.262789  -0.000000   0.123340  -0.755155  -0.000000  -0.201204   0.005842
+  -0.000018  -0.000000  -0.148374   0.000000   0.585750   0.000000  -0.000000   0.185913  -0.000000  -0.000000
+  -0.000000   0.000025  -0.000000  -0.172421   0.000000  -0.647892   0.127141   0.000000   0.217075  -0.071598
+      8       4.0600       4.0680   -462.5461843711    -462.5461171222
+  The vectors            1           2  seem congerved : we take them out
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            7  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+       -0.277556E-14   -0.137931E-15
+       -0.137931E-15    0.932587E-14
+
+ Energies :   -462.546184371053926    -462.546117122204123
+ E ss ref :     -3.036317033108683      -3.036249784258925
+ dE (a.u.):      0.000000000000000       0.000067248849759
+ dE (meV) :      0.000000000000000       1.829934425380132
+ |Hv-Ev|  :             6.6481E-06              8.8868E-06
+ deltaE   :            -3.5237E-10             -6.0925E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime            37.48s Walltime:            37.95s
+ Calculation finished on 13-11-2019 at 17:10
diff --git a/test/CuO_12423/test b/test/CuO_12423/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_12423/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_20204/INPUT b/test/CuO_20204/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..d7338db559c082c408f4bd61cd9f10b1d2b42670
--- /dev/null
+++ b/test/CuO_20204/INPUT
@@ -0,0 +1,45 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.
+   iprint=1,
+   sizebatch = 2
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 2, 
+   norb_ligo = 0, 
+   norb_act  = 2, 
+   norb_ligv = 0, 
+   norb_virt = 4, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=1, 
+  nelact = 2
+ &end
+
+ &davidinp
+  NiterDavidson = 50,
+  SizeheffDavidson = 5,
+  tol_conv =1.d-16,
+ &end
+
diff --git a/test/CuO_20204/cuo.TraInt b/test/CuO_20204/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_20204/cuo.TraInt differ
diff --git a/test/CuO_20204/cuo.TraOne b/test/CuO_20204/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_20204/cuo.TraOne differ
diff --git a/test/CuO_20204/cuo.ref0 b/test/CuO_20204/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..6f920df2bbc84673d193668f4c3599958e8df70a
--- /dev/null
+++ b/test/CuO_20204/cuo.ref0
@@ -0,0 +1,3 @@
+43u 44d
+
+
diff --git a/test/CuO_20204/result/cuo.out b/test/CuO_20204/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..d023102380439b7c2c6e9be77dbff751c84e5ee1
--- /dev/null
+++ b/test/CuO_20204/result/cuo.out
@@ -0,0 +1,285 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:02
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   2
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   2
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   4
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     2     0     2     0     4    70     8   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   2
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :  50
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            2
+       Molcas    :      41     42
+       Molcas/ir :      41     42
+       SelS      :      41     42
+       SelS up   :      81     82
+       SelS dn   :      83     84
+    Ligo   =            0
+    Act    =            2
+       Molcas    :      43     44
+       Molcas/ir :      43     44
+       SelS      :      43     44
+       SelS up   :      85     86
+       SelS dn   :      87     88
+    Ligv   =            0
+    Virt   =            4
+       Molcas    :      45     46     47     48
+       Molcas/ir :      45     46     47     48
+       SelS      :      45     46     47     48
+       SelS up   :      89     90     91     92
+       SelS dn   :      93     94     95     96
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    10 01 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  2
+  Ref1 Cas  -> Cas  :    1 ->     2
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                        4
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                       80
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        8
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                       16
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                           108
+ >>>Determinants generated in   0.0000000000000000      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                6
+  (ao|oo)                               12
+  (aa|oo) and (ao|ao)                   19
+  (aa|ao)                               12
+  (aa|aa)                                6
+  (vo|oo)                               24
+  (va|oo) and (vo|ao)                   56
+  (va|ao) and (vo|aa)                   56
+  (va|aa)                               24
+  (vv|oo) and (vo|vo)                   66
+  (vv|ao), and (va|vo)                 104
+  (vv|aa) and (va|va)                   66
+  (vv|vo)                               80
+  (vv|va)                               80
+  (vv|vv)                               55
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000001E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -5.6333251447329564     
+  Two-electron energy =    1.4293525186717915     
+  E0                  =   -4.2039726260611650     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -461.29014672668484     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000000 second(s)  Wall time:    0.003000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-08
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5453135932    -462.5452409962
+      1       0.0080       0.0130   -462.5453135932    -462.5452409962
+      2       0.0080       0.0110   -462.5453181074    -462.5452478736
+      3       0.0080       0.0110   -462.5453186657    -462.5452483434
+      4       0.0080       0.0110   -462.5453187625    -462.5452484289
+      5       0.0080       0.0120   -462.5453187664    -462.5452484345
+  >>> On contracte <<<
+      6       0.0080       0.0130   -462.5453187664    -462.5452484345
+      7       0.0080       0.0130   -462.5453187667    -462.5452484350
+      8       0.0080       0.0120   -462.5453187668    -462.5452484351
+      9       0.0120       0.0130   -462.5453187668    -462.5452484352
+     10       0.0080       0.0140   -462.5453187668    -462.5452484352
+  >>> On contracte <<<
+     11       0.0080       0.0140   -462.5453187668    -462.5452484352
+     12       0.0080       0.0120   -462.5453187668    -462.5452484352
+     13       0.0080       0.0130   -462.5453187668    -462.5452484352
+     14       0.0080       0.0130   -462.5453187668    -462.5452484352
+  The vectors            1  seem congerved : we take them out
+     15       0.0120       0.0120   -462.5452484352
+     16       0.0080       0.0130   -462.5452484352
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   16  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-16 <<<
+ >>> Convergence reached after           15  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.666134E-15    0.410634E-16
+        0.410634E-16    0.222045E-15
+
+ Energies :   -462.545318766821993    -462.545248435157418
+ E ss ref :     -1.255172040137126      -1.255101708472571
+ dE (a.u.):      0.000000000000000       0.000070331664555
+ dE (meV) :      0.000000000000000       1.913822089527890
+ |Hv-Ev|  :             5.7892E-09              6.1715E-09
+ deltaE   :            -1.7764E-15             -2.2204E-16
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.16s Walltime:             2.59s
+ Calculation finished on 04-09-2019 at 15:02
diff --git a/test/CuO_20204/test b/test/CuO_20204/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_20204/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_20204_spin/INPUT b/test/CuO_20204_spin/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..8d5cb3582fd315a0d6822ea4fdd674adedadbc85
--- /dev/null
+++ b/test/CuO_20204_spin/INPUT
@@ -0,0 +1,45 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.
+   iprint=1,
+   sizebatch = 2
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 2, 
+   norb_ligo = 0, 
+   norb_act  = 2, 
+   norb_ligv = 0, 
+   norb_virt = 4, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=3, 
+  sz=2, 
+  vec_irrep=1, 
+  nvec=1, 
+  nref0=1, 
+  nelact = 2
+ &end
+
+ &davidinp
+  NiterDavidson = 50,
+  SizeheffDavidson = 5,
+  tol_conv =1.d-16,
+ &end
+
diff --git a/test/CuO_20204_spin/cuo.TraInt b/test/CuO_20204_spin/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_20204_spin/cuo.TraInt differ
diff --git a/test/CuO_20204_spin/cuo.TraOne b/test/CuO_20204_spin/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_20204_spin/cuo.TraOne differ
diff --git a/test/CuO_20204_spin/cuo.ref0 b/test/CuO_20204_spin/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..caf5bfc042e3c39bec77f876f13e1972f418eecc
--- /dev/null
+++ b/test/CuO_20204_spin/cuo.ref0
@@ -0,0 +1,3 @@
+43u 44u
+
+
diff --git a/test/CuO_20204_spin/result/cuo.out b/test/CuO_20204_spin/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..b6b2752a5f1279507ec90fbd9bbdc9cc36591e07
--- /dev/null
+++ b/test/CuO_20204_spin/result/cuo.out
@@ -0,0 +1,285 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:02
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   2
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   2
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   4
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     2     0     2     0     4    70     8   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   2
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :  50
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            2
+       Molcas    :      41     42
+       Molcas/ir :      41     42
+       SelS      :      41     42
+       SelS up   :      81     82
+       SelS dn   :      83     84
+    Ligo   =            0
+    Act    =            2
+       Molcas    :      43     44
+       Molcas/ir :      43     44
+       SelS      :      43     44
+       SelS up   :      85     86
+       SelS dn   :      87     88
+    Ligv   =            0
+    Virt   =            4
+       Molcas    :      45     46     47     48
+       Molcas/ir :      45     46     47     48
+       SelS      :      45     46     47     48
+       SelS up   :      89     90     91     92
+       SelS dn   :      93     94     95     96
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    10 01 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  2
+  Ref1 Cas  -> Cas  :    1 ->     2
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                        4
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                       80
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        8
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                       16
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                           108
+ >>>Determinants generated in   0.0000000000000000      second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                6
+  (ao|oo)                               12
+  (aa|oo) and (ao|ao)                   19
+  (aa|ao)                               12
+  (aa|aa)                                6
+  (vo|oo)                               24
+  (va|oo) and (vo|ao)                   56
+  (va|ao) and (vo|aa)                   56
+  (va|aa)                               24
+  (vv|oo) and (vo|vo)                   66
+  (vv|ao), and (va|vo)                 104
+  (vv|aa) and (va|va)                   66
+  (vv|vo)                               80
+  (vv|va)                               80
+  (vv|vv)                               55
+  gelees                                 0
+ >>> Integrals read in   4.0000000000000001E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -5.6333251447329564     
+  Two-electron energy =    1.4293525186717915     
+  E0                  =   -4.2039726260611650     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -461.29014672668484     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000000 second(s)  Wall time:    0.003000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-08
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5453135932    -462.5452409962
+      1       0.0080       0.0130   -462.5453135932    -462.5452409962
+      2       0.0080       0.0110   -462.5453181074    -462.5452478736
+      3       0.0080       0.0110   -462.5453186657    -462.5452483434
+      4       0.0080       0.0110   -462.5453187625    -462.5452484289
+      5       0.0080       0.0120   -462.5453187664    -462.5452484345
+  >>> On contracte <<<
+      6       0.0080       0.0130   -462.5453187664    -462.5452484345
+      7       0.0080       0.0130   -462.5453187667    -462.5452484350
+      8       0.0080       0.0120   -462.5453187668    -462.5452484351
+      9       0.0120       0.0130   -462.5453187668    -462.5452484352
+     10       0.0080       0.0140   -462.5453187668    -462.5452484352
+  >>> On contracte <<<
+     11       0.0080       0.0140   -462.5453187668    -462.5452484352
+     12       0.0080       0.0120   -462.5453187668    -462.5452484352
+     13       0.0080       0.0130   -462.5453187668    -462.5452484352
+     14       0.0080       0.0130   -462.5453187668    -462.5452484352
+  The vectors            1  seem congerved : we take them out
+     15       0.0120       0.0120   -462.5452484352
+     16       0.0080       0.0130   -462.5452484352
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   16  ncol=  3 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-16 <<<
+ >>> Convergence reached after           15  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.666134E-15    0.410634E-16
+        0.410634E-16    0.222045E-15
+
+ Energies :   -462.545318766821993    
+ E ss ref :     -1.255172040137126      -1.255101708472571
+ dE (a.u.):      0.000000000000000       0.000070331664555
+ dE (meV) :      0.000000000000000       1.913822089527890
+ |Hv-Ev|  :             5.7892E-09              6.1715E-09
+ deltaE   :            -1.7764E-15             -2.2204E-16
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.16s Walltime:             2.59s
+ Calculation finished on 04-09-2019 at 15:02
diff --git a/test/CuO_20204_spin/test b/test/CuO_20204_spin/test
new file mode 100755
index 0000000000000000000000000000000000000000..b91baaa2fb768356d2377780472cba9283957990
--- /dev/null
+++ b/test/CuO_20204_spin/test
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_20240/INPUT b/test/CuO_20240/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..21620c08eab5c62cfd929daad618c7329a023320
--- /dev/null
+++ b/test/CuO_20240/INPUT
@@ -0,0 +1,44 @@
+#
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false.,
+   restart=.false.
+   lexplicitHmat = .false.,
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=8, 
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 40, 
+   norb_occ  = 2, 
+   norb_ligo = 0, 
+   norb_act  = 2, 
+   norb_ligv = 4, 
+   norb_virt = 0, 
+   norb_del  = 70
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=1, 
+  nelact = 2
+ &end
+
+ &davidinp
+  NiterDavidson = 50,
+  SizeheffDavidson = 5,
+  tol_conv =1.d-16,
+ &end
+
diff --git a/test/CuO_20240/cuo.TraInt b/test/CuO_20240/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..eb847f50bd13481b38db0a428d0047f691f20c26
Binary files /dev/null and b/test/CuO_20240/cuo.TraInt differ
diff --git a/test/CuO_20240/cuo.TraOne b/test/CuO_20240/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..aa714dba2b3f06d4e8b99bc627f524061ba862b5
Binary files /dev/null and b/test/CuO_20240/cuo.TraOne differ
diff --git a/test/CuO_20240/cuo.ref0 b/test/CuO_20240/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..6f920df2bbc84673d193668f4c3599958e8df70a
--- /dev/null
+++ b/test/CuO_20240/cuo.ref0
@@ -0,0 +1,3 @@
+43u 44d
+
+
diff --git a/test/CuO_20240/result/cuo.out b/test/CuO_20240/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..32224c6f140fd4b059cbc19b2ef34814e185e79f
--- /dev/null
+++ b/test/CuO_20240/result/cuo.out
@@ -0,0 +1,286 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 17-03-2020 at 15:56
+
+ >>> Method sas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  tol_orth too low : increased to    9.9999999999999992E-018
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :   8
+  Nbre d'orbitales gelees          :  40
+  Nbre d'orbitales occuppees       :   2
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   2
+  Nbre d'orbitales lig. virt       :   4
+  Nbre d'orbitales virtuelles      :   0
+  Nbre d'orbitales deletees        :  70
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  40     2     0     2     4     0    70     8   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   2
+
+  Size of the Davidson Heff        :   5
+  Nbr of Davidson super-iter       :  50
+  Orthogonality threshold          : 1.0E-17
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-16
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           40
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      41     42     43     44     45     46     47     48     49     50
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      51     52     53     54     55     56     57     58     59     60
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      61     62     63     64     65     66     67     68     69     70
+ 
+       Molcas    :      31     32     33     34     35     36     37     38     39     40
+       Molcas/ir :      31     32     33     34     35     36     37     38     39     40
+       SelS      :      31     32     33     34     35     36     37     38     39     40
+       SelS up   :      31     32     33     34     35     36     37     38     39     40
+       SelS dn   :      71     72     73     74     75     76     77     78     79     80
+ 
+    Occ    =            2
+       Molcas    :      41     42
+       Molcas/ir :      41     42
+       SelS      :      41     42
+       SelS up   :      81     82
+       SelS dn   :      83     84
+    Ligo   =            0
+    Act    =            2
+       Molcas    :      43     44
+       Molcas/ir :      43     44
+       SelS      :      43     44
+       SelS up   :      85     86
+       SelS dn   :      87     88
+    Ligv   =            4
+       Molcas    :      45     46     47     48
+       Molcas/ir :      45     46     47     48
+       SelS      :      45     46     47     48
+       SelS up   :      89     90     91     92
+       SelS dn   :      93     94     95     96
+    Virt   =            0
+    Delete =           70
+       Molcas    :      49     50     51     52     53     54     55     56     57     58
+       Molcas/ir :      49     50     51     52     53     54     55     56     57     58
+       SelS      :      49     50     51     52     53     54     55     56     57     58
+       SelS up   :      97     98     99    100    101    102    103    104    105    106
+       SelS dn   :     167    168    169    170    171    172    173    174    175    176
+ 
+       Molcas    :      59     60     61     62     63     64     65     66     67     68
+       Molcas/ir :      59     60     61     62     63     64     65     66     67     68
+       SelS      :      59     60     61     62     63     64     65     66     67     68
+       SelS up   :     107    108    109    110    111    112    113    114    115    116
+       SelS dn   :     177    178    179    180    181    182    183    184    185    186
+ 
+       Molcas    :      69     70     71     72     73     74     75     76     77     78
+       Molcas/ir :      69     70     71     72     73     74     75     76     77     78
+       SelS      :      69     70     71     72     73     74     75     76     77     78
+       SelS up   :     117    118    119    120    121    122    123    124    125    126
+       SelS dn   :     187    188    189    190    191    192    193    194    195    196
+ 
+       Molcas    :      79     80     81     82     83     84     85     86     87     88
+       Molcas/ir :      79     80     81     82     83     84     85     86     87     88
+       SelS      :      79     80     81     82     83     84     85     86     87     88
+       SelS up   :     127    128    129    130    131    132    133    134    135    136
+       SelS dn   :     197    198    199    200    201    202    203    204    205    206
+ 
+       Molcas    :      89     90     91     92     93     94     95     96     97     98
+       Molcas/ir :      89     90     91     92     93     94     95     96     97     98
+       SelS      :      89     90     91     92     93     94     95     96     97     98
+       SelS up   :     137    138    139    140    141    142    143    144    145    146
+       SelS dn   :     207    208    209    210    211    212    213    214    215    216
+ 
+       Molcas    :      99    100    101    102    103    104    105    106    107    108
+       Molcas/ir :      99    100    101    102    103    104    105    106    107    108
+       SelS      :      99    100    101    102    103    104    105    106    107    108
+       SelS up   :     147    148    149    150    151    152    153    154    155    156
+       SelS dn   :     217    218    219    220    221    222    223    224    225    226
+ 
+       Molcas    :     109    110    111    112    113    114    115    116    117    118
+       Molcas/ir :     109    110    111    112    113    114    115    116    117    118
+       SelS      :     109    110    111    112    113    114    115    116    117    118
+       SelS up   :     157    158    159    160    161    162    163    164    165    166
+       SelS dn   :     227    228    229    230    231    232    233    234    235    236
+ 
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :   1
+    1   :    10 01 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final :  2
+  Ref1 Cas  -> Cas  :    1 ->     2
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                        4
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                       80
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                        8
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                       16
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                      176
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                       16
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                           300
+ >>>Determinants generated in   2.4380000000000001E-003 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -457.08617410
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           36
+  Nombre d'integrales mono-electroniques lues  =           36
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals            666
+  (oo|oo)                                6
+  (ao|oo)                               12
+  (aa|oo) and (ao|ao)                   19
+  (aa|ao)                               12
+  (aa|aa)                                6
+  (vo|oo)                               24
+  (va|oo) and (vo|ao)                   56
+  (va|ao) and (vo|aa)                   56
+  (va|aa)                               24
+  (vv|oo) and (vo|vo)                   66
+  (vv|ao), and (va|vo)                 104
+  (vv|aa) and (va|va)                   66
+  (vv|vo)                               80
+  (vv|va)                               80
+  (vv|vv)                               55
+  gelees                                 0
+ >>> Integrals read in   4.0010000000000002E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   4.7399999999999873E-004 second(s)
+
+  One-electron energy =   -5.6333251447329564     
+  Two-electron energy =    1.4293525186717915     
+  E0                  =   -4.2039726260611650     
+  Pot. Nuc.           =   -457.08617410062368     
+  Total E             =   -461.29014672668484     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000662 second(s)  Wall time:    0.000000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   9.2999999999999333E-005 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-08
+
+Total Elapsed tWall       0.0100
+s
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0106       0.0100   -462.5453135932    -462.5452409962
+      1       0.0106       0.0100   -462.5453135932    -462.5452409962
+      2       0.0086       0.0080   -462.5453310460    -462.5452606238
+      3       0.0077       0.0070   -462.5453316310    -462.5452611503
+      4       0.0068       0.0070   -462.5453317680    -462.5452612551
+      5       0.0096       0.0100   -462.5453317782    -462.5452612658
+  >>> On contracte <<<
+      6       0.0072       0.0070   -462.5453317782    -462.5452612658
+      7       0.0061       0.0060   -462.5453317787    -462.5452612665
+      8       0.0061       0.0060   -462.5453317788    -462.5452612666
+      9       0.0066       0.0070   -462.5453317788    -462.5452612667
+     10       0.0079       0.0070   -462.5453317788    -462.5452612667
+  >>> On contracte <<<
+     11       0.0064       0.0060   -462.5453317788    -462.5452612667
+     12       0.0111       0.0110   -462.5453317788    -462.5452612667
+     13       0.0074       0.0070   -462.5453317788    -462.5452612667
+     14       0.0060       0.0060   -462.5453317788    -462.5452612667
+  The vectors            1  seem congerved : we take them out
+     15       0.0060       0.0070   -462.5452612667
+     16       0.0061       0.0060   -462.5452612667
+     17       0.0066       0.0070   -462.5452612667
+  The vectors            1  seem congerved : we take them out
+-- Davidson' iteration:   17  ncol=  4 Nbre of converged vectors:  2 Nbre of remaining  vectors:  0
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-16 <<<
+ >>> Convergence reached after           16  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.155431E-14   -0.169323E-16
+       -0.169323E-16    0.222045E-15
+
+ Energies :   -462.545331778771867    -462.545261266666444
+ E ss ref :     -1.255185052087007      -1.255114539981613
+ dE (a.u.):      0.000000000000000       0.000070512105394
+ dE (meV) :      0.000000000000000       1.918732134890760
+ |Hv-Ev|  :             7.8808E-09              4.1834E-09
+ deltaE   :            -8.8818E-16             -2.2204E-16
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.15s Walltime:             0.15s
+ Calculation finished on 17-03-2020 at 15:56
diff --git a/test/CuO_20240/test b/test/CuO_20240/test
new file mode 100755
index 0000000000000000000000000000000000000000..465ba6a110d8fe1d2c2a952cdf8bd15f6f66f8cb
--- /dev/null
+++ b/test/CuO_20240/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-10)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-6)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_30405/INPUT b/test/CuO_30405/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..b9540b7cea718d5a77e78d5a905b9c3127702313
--- /dev/null
+++ b/test/CuO_30405/INPUT
@@ -0,0 +1,42 @@
+#
+# Test with only Single excitations on a bigger active space
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 3, 
+   norb_ligo = 0, 
+   norb_act  = 4, 
+   norb_ligv = 0, 
+   norb_virt = 5, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=13, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_30405/cuo.TraInt b/test/CuO_30405/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_30405/cuo.TraInt differ
diff --git a/test/CuO_30405/cuo.TraOne b/test/CuO_30405/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_30405/cuo.TraOne differ
diff --git a/test/CuO_30405/cuo.ref0 b/test/CuO_30405/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_30405/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_30405/result/cuo.out b/test/CuO_30405/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..97f1e57beaf755a463c0a8c0096a1db091f2b0d4
--- /dev/null
+++ b/test/CuO_30405/result/cuo.out
@@ -0,0 +1,282 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 04-09-2019 at 15:08
+
+ >>> Method sas+s 
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Taille memoire                   :2000
+
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   3
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   5
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     3     0     4     0     5    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Ligo   =            0
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            0
+    Virt   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  13
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 30
+  Ref1 Cas  -> Cas  :    1 ->     6
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                          1980
+ >>>Determinants generated in   1.6000000000000000E-002 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   7.9999999999999967E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.004000 second(s)  Wall time:    0.003000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.1160       0.1340   -462.5452856260    -462.5452132936
+      2       0.0800       0.0850   -462.5454831739    -462.5454132703
+      3       0.1320       0.1370   -462.5454931295    -462.5454236285
+      4       0.0840       0.0900   -462.5454940341    -462.5454243975
+      5       0.1280       0.1370   -462.5454941852    -462.5454245276
+      6       0.1000       0.1040   -462.5454941973    -462.5454245437
+      7       0.0680       0.0750   -462.5454941986    -462.5454245457
+      8       0.0840       0.0900   -462.5454941987    -462.5454245459
+  The vectors            1           2  seem congerved : we take them out
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            7  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.177636E-14   -0.606842E-16
+       -0.606842E-16    0.133227E-14
+
+ Energies :   -462.545494198736606    -462.545424545917570
+ E ss ref :     -3.035626860791400      -3.035557207972354
+ dE (a.u.):      0.000000000000000       0.000069652819046
+ dE (meV) :      0.000000000000000       1.895349762177358
+ |Hv-Ev|  :             4.7116E-06              6.2975E-06
+ deltaE   :            -1.7989E-10             -2.6643E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.96s Walltime:             2.80s
+ Calculation finished on 04-09-2019 at 15:08
diff --git a/test/CuO_30405/test b/test/CuO_30405/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_30405/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_CAS+S/INPUT b/test/CuO_CAS+S/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..b58f19ba40ef49e56646773bae22416b6e706018
--- /dev/null
+++ b/test/CuO_CAS+S/INPUT
@@ -0,0 +1,43 @@
+#
+# Test with only Single excitations on a bigger active space
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   method = "CAS+S"
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 3, 
+   norb_ligo = 0, 
+   norb_act  = 4, 
+   norb_ligv = 0, 
+   norb_virt = 5, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=13, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
diff --git a/test/CuO_CAS+S/cuo.TraInt b/test/CuO_CAS+S/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_CAS+S/cuo.TraInt differ
diff --git a/test/CuO_CAS+S/cuo.TraOne b/test/CuO_CAS+S/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_CAS+S/cuo.TraOne differ
diff --git a/test/CuO_CAS+S/result/cuo.out b/test/CuO_CAS+S/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..1f39ce0b9fea67a37a229ca57052c6ffc2640947
--- /dev/null
+++ b/test/CuO_CAS+S/result/cuo.out
@@ -0,0 +1,279 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ RELEASE Version
+ Calculation started on 22-11-2019 at 14:50
+
+ >>> Method cas+s   
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   3
+  Nbre d'orbitales lig. occ        :   0
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   0
+  Nbre d'orbitales virtuelles      :   5
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     3     0     4     0     5    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            3
+       Molcas    :      39     40     41
+       Molcas/ir :      39     40     41
+       SelS      :      39     40     41
+       SelS up   :      77     78     79
+       SelS dn   :      80     81     82
+    Ligo   =            0
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            0
+    Virt   =            5
+       Molcas    :      46     47     48     49     50
+       Molcas/ir :      46     47     48     49     50
+       SelS      :      46     47     48     49     50
+       SelS up   :      91     92     93     94     95
+       SelS dn   :      96     97     98     99    100
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Ref0 = CAS
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+
+ >>> Generation of all determinants
+  Nbre de det Ref0 final : 30
+  Ref1 Cas  -> Cas  :    1 ->     6
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Generation of D2
+  Nb of determinants in D  2 =                                        0
+  >>> Determinant block D2 generated in     0.00 second(s)
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                        0
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                        0
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                        0
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                        0
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                          1980
+ >>>Determinants generated in   2.0000000000000000E-002 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   8.0000000000000002E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.000000 second(s)  Wall time:    0.003000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   3.9999999999999966E-003 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+      1       0.0680       0.0810   -462.5452856260    -462.5452132936
+      2       0.0800       0.0850   -462.5454831739    -462.5454132703
+      3       0.0480       0.0550   -462.5454931295    -462.5454236285
+      4       0.0480       0.0550   -462.5454940341    -462.5454243975
+      5       0.0480       0.0550   -462.5454941852    -462.5454245276
+      6       0.0480       0.0560   -462.5454941973    -462.5454245437
+      7       0.0480       0.0540   -462.5454941986    -462.5454245457
+      8       0.0480       0.0540   -462.5454941987    -462.5454245459
+  The vectors            1           2  seem congerved : we take them out
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            7  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.177636E-14   -0.606842E-16
+       -0.606842E-16    0.133227E-14
+
+ Energies :   -462.545494198736606    -462.545424545917570
+ E ss ref :     -3.035626860791400      -3.035557207972354
+ dE (a.u.):      0.000000000000000       0.000069652819046
+ dE (meV) :      0.000000000000000       1.895349762177358
+ |Hv-Ev|  :             4.7116E-06              6.2975E-06
+ deltaE   :            -1.7989E-10             -2.6643E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             0.53s Walltime:             0.82s
+ Calculation finished on 22-11-2019 at 14:50
diff --git a/test/CuO_CAS+S/test b/test/CuO_CAS+S/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_CAS+S/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/CuO_DDCI/INPUT b/test/CuO_DDCI/INPUT
new file mode 100644
index 0000000000000000000000000000000000000000..1699b8347f867271a10aa7a5e4a942ff1b2eeeb3
--- /dev/null
+++ b/test/CuO_DDCI/INPUT
@@ -0,0 +1,46 @@
+#
+# Test with only Single excitations on a bigger active space
+#
+
+ &sassinp
+   prefix="cuo",
+   prt_cipci=.false., 
+   method = "SAS+DDCI"
+   iprint=1
+ &end
+
+ &infomolcasinp
+   nirrep=1, 
+   ntot=12,
+   iIrTb(1,1) = 1, 
+   iChTb(1,1) = 1
+ &end
+
+
+ &orbinp
+   norb_gel  = 38, 
+   norb_occ  = 2, 
+   norb_ligo = 1, 
+   norb_act  = 4, 
+   norb_ligv = 1, 
+   norb_virt = 4, 
+   norb_del  = 68
+ &end
+
+ &vecinp
+  stot=1, 
+  sz=0, 
+  vec_irrep=1, 
+  nvec=2, 
+  nref0=13, 
+  nelact = 4
+ &end
+
+ &davidinp
+ SizeheffDavidson = 10,
+ tol_conv = 1.d-10,
+ &end
+
+ &propinp
+  nprop = 0
+ &end
diff --git a/test/CuO_DDCI/cuo.TraInt b/test/CuO_DDCI/cuo.TraInt
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8bba427b347d8e39f0891f677afd28a848161
Binary files /dev/null and b/test/CuO_DDCI/cuo.TraInt differ
diff --git a/test/CuO_DDCI/cuo.TraOne b/test/CuO_DDCI/cuo.TraOne
new file mode 100644
index 0000000000000000000000000000000000000000..ebe5faa748583797c307b5aeaa0c174a41ff9612
Binary files /dev/null and b/test/CuO_DDCI/cuo.TraOne differ
diff --git a/test/CuO_DDCI/cuo.ref0 b/test/CuO_DDCI/cuo.ref0
new file mode 100644
index 0000000000000000000000000000000000000000..477788d2fb0523a9635de637126051147a0d45c8
--- /dev/null
+++ b/test/CuO_DDCI/cuo.ref0
@@ -0,0 +1,21 @@
+42u 43d 44u 45d
+42u 42d 43u 44d
+42u 43u 43d 44d
+42u 43d 44u 44d
+42u 42d 43u 45d
+42u 43u 43d 45d
+42u 43d 45u 45d
+42u 42d 45u 44d
+42u 45u 45d 44d
+42u 45d 44u 44d
+45u 45d 43u 44d
+45u 43u 43d 44d
+45u 43d 44u 44d
+42u 42d 43u 43d
+42u 42d 44u 44d
+42u 42d 45u 45d
+43u 43d 44u 44d
+43u 43d 45u 45d
+44u 44d 45u 45d
+
+
diff --git a/test/CuO_DDCI/result/cuo.out b/test/CuO_DDCI/result/cuo.out
new file mode 100644
index 0000000000000000000000000000000000000000..a24668c3f1c38ac991e6ae40f4e610bfbba06d8f
--- /dev/null
+++ b/test/CuO_DDCI/result/cuo.out
@@ -0,0 +1,962 @@
+ ***********************************************
+
+         Programme   SASS
+
+ ***********************************************
+ DEBUG VersionT
+ Calculation started on 26-11-2019 at 14:04
+
+ >>> Method sas+ddci
+ >>> Ouverture des fichiers
+  out :                                                                         cuo.out
+ fock :                                                                        cuo.fock
+hcore :                                                                       cuo.hcore
+ ref0 :                                                                        cuo.ref0
+  det :                                                                         cuo.det
+resta :                                                                     cuo.restart
+  mat :                                                                         cuo.mat
+ mat2 :                                                                        cuo.mat2
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Lecture des donnees
+ ----------------------------------------------------------------------------------------------------
+  Transfert d''information par namelist
+  Nbre d'irrep                     :   1
+  Nbre total d'orbitales           :  12
+  Nbre d'orbitales gelees          :  38
+  Nbre d'orbitales occuppees       :   2
+  Nbre d'orbitales lig. occ        :   1
+  Nbre d'orbitales actives         :   4
+  Nbre d'orbitales lig. virt       :   1
+  Nbre d'orbitales virtuelles      :   4
+  Nbre d'orbitales deletees        :  68
+  Nbre d'orbitales total           : ngel  nocc  nligo nact  nligv nvirt ndel  ntot Total
+                                   :  38     2     1     4     1     4    68    12   118
+
+  Nbre de vecteurs                 :   2
+  2S+1, 2Sz                        :   1     0
+  Irrep                            :   1
+  Nbre d'electrons actifs          :   4
+
+  Size of the Davidson Heff        :  10
+  Nbr of Davidson super-iter       : 100
+  Orthogonality threshold          : 1.0E-15
+  Normalisation threshold          : 1.0E-15
+  Conv. threshold on vectors       : 1.0E-10
+  Expected threshold on energies   : 1.0E-14
+  Nbr of 1st iter (restart)        :   0
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Preparations 
+ ----------------------------------------------------------------------------------------------------
+ >>> Ordre des orbitales Molcas <-> SASS
+   Ordre des orbitales MOLCAS ds SelS
+    Irrep =  1
+    Gelees =           38
+       Molcas    :       1      2      3      4      5      6      7      8      9     10
+       Molcas/ir :       1      2      3      4      5      6      7      8      9     10
+       SelS      :       1      2      3      4      5      6      7      8      9     10
+       SelS up   :       1      2      3      4      5      6      7      8      9     10
+       SelS dn   :      39     40     41     42     43     44     45     46     47     48
+ 
+       Molcas    :      11     12     13     14     15     16     17     18     19     20
+       Molcas/ir :      11     12     13     14     15     16     17     18     19     20
+       SelS      :      11     12     13     14     15     16     17     18     19     20
+       SelS up   :      11     12     13     14     15     16     17     18     19     20
+       SelS dn   :      49     50     51     52     53     54     55     56     57     58
+ 
+       Molcas    :      21     22     23     24     25     26     27     28     29     30
+       Molcas/ir :      21     22     23     24     25     26     27     28     29     30
+       SelS      :      21     22     23     24     25     26     27     28     29     30
+       SelS up   :      21     22     23     24     25     26     27     28     29     30
+       SelS dn   :      59     60     61     62     63     64     65     66     67     68
+ 
+       Molcas    :      31     32     33     34     35     36     37     38
+       Molcas/ir :      31     32     33     34     35     36     37     38
+       SelS      :      31     32     33     34     35     36     37     38
+       SelS up   :      31     32     33     34     35     36     37     38
+       SelS dn   :      69     70     71     72     73     74     75     76
+    Occ    =            2
+       Molcas    :      39     40
+       Molcas/ir :      39     40
+       SelS      :      39     40
+       SelS up   :      77     78
+       SelS dn   :      80     81
+    Ligo   =            1
+       Molcas    :      41
+       Molcas/ir :      41
+       SelS      :      41
+       SelS up   :      79
+       SelS dn   :      82
+    Act    =            4
+       Molcas    :      42     43     44     45
+       Molcas/ir :      42     43     44     45
+       SelS      :      42     43     44     45
+       SelS up   :      83     84     85     86
+       SelS dn   :      87     88     89     90
+    Ligv   =            1
+       Molcas    :      46
+       Molcas/ir :      46
+       SelS      :      46
+       SelS up   :      91
+       SelS dn   :      96
+    Virt   =            4
+       Molcas    :      47     48     49     50
+       Molcas/ir :      47     48     49     50
+       SelS      :      47     48     49     50
+       SelS up   :      92     93     94     95
+       SelS dn   :      97     98     99    100
+    Delete =           68
+       Molcas    :      51     52     53     54     55     56     57     58     59     60
+       Molcas/ir :      51     52     53     54     55     56     57     58     59     60
+       SelS      :      51     52     53     54     55     56     57     58     59     60
+       SelS up   :     101    102    103    104    105    106    107    108    109    110
+       SelS dn   :     169    170    171    172    173    174    175    176    177    178
+ 
+       Molcas    :      61     62     63     64     65     66     67     68     69     70
+       Molcas/ir :      61     62     63     64     65     66     67     68     69     70
+       SelS      :      61     62     63     64     65     66     67     68     69     70
+       SelS up   :     111    112    113    114    115    116    117    118    119    120
+       SelS dn   :     179    180    181    182    183    184    185    186    187    188
+ 
+       Molcas    :      71     72     73     74     75     76     77     78     79     80
+       Molcas/ir :      71     72     73     74     75     76     77     78     79     80
+       SelS      :      71     72     73     74     75     76     77     78     79     80
+       SelS up   :     121    122    123    124    125    126    127    128    129    130
+       SelS dn   :     189    190    191    192    193    194    195    196    197    198
+ 
+       Molcas    :      81     82     83     84     85     86     87     88     89     90
+       Molcas/ir :      81     82     83     84     85     86     87     88     89     90
+       SelS      :      81     82     83     84     85     86     87     88     89     90
+       SelS up   :     131    132    133    134    135    136    137    138    139    140
+       SelS dn   :     199    200    201    202    203    204    205    206    207    208
+ 
+       Molcas    :      91     92     93     94     95     96     97     98     99    100
+       Molcas/ir :      91     92     93     94     95     96     97     98     99    100
+       SelS      :      91     92     93     94     95     96     97     98     99    100
+       SelS up   :     141    142    143    144    145    146    147    148    149    150
+       SelS dn   :     209    210    211    212    213    214    215    216    217    218
+ 
+       Molcas    :     101    102    103    104    105    106    107    108    109    110
+       Molcas/ir :     101    102    103    104    105    106    107    108    109    110
+       SelS      :     101    102    103    104    105    106    107    108    109    110
+       SelS up   :     151    152    153    154    155    156    157    158    159    160
+       SelS dn   :     219    220    221    222    223    224    225    226    227    228
+ 
+       Molcas    :     111    112    113    114    115    116    117    118
+       Molcas/ir :     111    112    113    114    115    116    117    118
+       SelS      :     111    112    113    114    115    116    117    118
+       SelS up   :     161    162    163    164    165    166    167    168
+       SelS dn   :     229    230    231    232    233    234    235    236
+
+
+ >>> Lecture des Ref0
+  Nbre de ref0 lues      :  13
+    1   :    1010 0101 
+    2   :    1100 1010 
+    3   :    1100 0110 
+    4   :    1010 0110 
+    5   :    1100 1001 
+    6   :    1100 0101 
+    7   :    1001 0101 
+    8   :    1001 1010 
+    9   :    1001 0011 
+   10   :    1010 0011 
+   11   :    0101 0011 
+   12   :    0101 0110 
+   13   :    0011 0110 
+
+ >>> Generation of all determinants
+  Ref0:     1  Couches fermees :   0 - 0000 0000  Ref0:     1  Couches ouvertes:   4 - 1111 0000
+  Ref0:     2  Couches fermees :   1 - 1000 0000  Ref0:     2  Couches ouvertes:   2 - 0110 0000
+  Ref0:     3  Couches fermees :   1 - 0100 0000  Ref0:     3  Couches ouvertes:   2 - 1010 0000
+  Ref0:     4  Couches fermees :   1 - 0010 0000  Ref0:     4  Couches ouvertes:   2 - 1100 0000
+  Ref0:     5  Couches fermees :   1 - 1000 0000  Ref0:     5  Couches ouvertes:   2 - 0101 0000
+  Ref0:     6  Couches fermees :   1 - 0100 0000  Ref0:     6  Couches ouvertes:   2 - 1001 0000
+  Ref0:     7  Couches fermees :   1 - 0001 0000  Ref0:     7  Couches ouvertes:   2 - 1100 0000
+  Ref0:     8  Couches fermees :   1 - 1000 0000  Ref0:     8  Couches ouvertes:   2 - 0011 0000
+  Ref0:     9  Couches fermees :   1 - 0001 0000  Ref0:     9  Couches ouvertes:   2 - 1010 0000
+  Ref0:    10  Couches fermees :   1 - 0010 0000  Ref0:    10  Couches ouvertes:   2 - 1001 0000
+  Ref0:    11  Couches fermees :   1 - 0001 0000  Ref0:    11  Couches ouvertes:   2 - 0110 0000
+  Ref0:    12  Couches fermees :   1 - 0100 0000  Ref0:    12  Couches ouvertes:   2 - 0011 0000
+  Ref0:    13  Couches fermees :   1 - 0010 0000  Ref0:    13  Couches ouvertes:   2 - 0101 0000
+
+  Nbre de conf d'espace unique : 13
+  Ref0 irr:     1  Couches fermees :   0 - 0000  Ref0 irr:     1  Couches ouvertes:   4 - 1111
+  Ref0 irr:     2  Couches fermees :   1 - 1000  Ref0 irr:     2  Couches ouvertes:   2 - 0110
+  Ref0 irr:     3  Couches fermees :   1 - 0100  Ref0 irr:     3  Couches ouvertes:   2 - 1010
+  Ref0 irr:     4  Couches fermees :   1 - 0010  Ref0 irr:     4  Couches ouvertes:   2 - 1100
+  Ref0 irr:     5  Couches fermees :   1 - 1000  Ref0 irr:     5  Couches ouvertes:   2 - 0101
+  Ref0 irr:     6  Couches fermees :   1 - 0100  Ref0 irr:     6  Couches ouvertes:   2 - 1001
+  Ref0 irr:     7  Couches fermees :   1 - 0001  Ref0 irr:     7  Couches ouvertes:   2 - 1100
+  Ref0 irr:     8  Couches fermees :   1 - 1000  Ref0 irr:     8  Couches ouvertes:   2 - 0011
+  Ref0 irr:     9  Couches fermees :   1 - 0001  Ref0 irr:     9  Couches ouvertes:   2 - 1010
+  Ref0 irr:    10  Couches fermees :   1 - 0010  Ref0 irr:    10  Couches ouvertes:   2 - 1001
+  Ref0 irr:    11  Couches fermees :   1 - 0001  Ref0 irr:    11  Couches ouvertes:   2 - 0110
+  Ref0 irr:    12  Couches fermees :   1 - 0100  Ref0 irr:    12  Couches ouvertes:   2 - 0011
+  Ref0 irr:    13  Couches fermees :   1 - 0010  Ref0 irr:    13  Couches ouvertes:   2 - 0101
+  Nbre de det Ref0 final : 30
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0011 1100
+0101 1010
+0110 1001
+1001 0110
+1010 0101
+1100 0011
+ Matrix to be diagonalised
+         2.000000     1.000000     1.000000     1.000000     1.000000     0.000000
+         1.000000     2.000000     1.000000     1.000000     0.000000     1.000000
+         1.000000     1.000000     2.000000     0.000000     1.000000     1.000000
+         1.000000     1.000000     0.000000     2.000000     1.000000     1.000000
+         1.000000     0.000000     1.000000     1.000000     2.000000     1.000000
+         0.000000     1.000000     1.000000     1.000000     1.000000     2.000000
+
+  Vecteurs propres
+
+  -0.000000   0.000000   2.000000   2.000000   2.000000   6.000000
+
+   0.000000   0.577350   0.000000   0.000000  -0.707107   0.408248
+   0.500000  -0.288675  -0.486671  -0.512982  -0.000000   0.408248
+  -0.500000  -0.288675  -0.512982   0.486671  -0.000000   0.408248
+  -0.500000  -0.288675   0.512982  -0.486671  -0.000000   0.408248
+   0.500000  -0.288675   0.486671   0.512982   0.000000   0.408248
+   0.000000   0.577350  -0.000000   0.000000   0.707107   0.408248
+    Valeurs pp de S2
+  -0.000000000000   0.000000000000   2.000000000000   2.000000000000   2.000000000000   6.000000000000
+
+    Nbre de conf S, Sz            2
+    0.000000    0.577350
+    0.500000   -0.288675
+   -0.500000   -0.288675
+   -0.500000   -0.288675
+    0.500000   -0.288675
+    0.000000    0.577350
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0100 1000
+1000 0100
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 1000
+1000 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 1000
+1000 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0010 0100
+0100 0010
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0010
+0010 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+ --------------------------------------------
+    Entree dans diag_S2 pour les etats :
+0001 0100
+0100 0001
+ Matrix to be diagonalised
+         1.000000     1.000000
+         1.000000     1.000000
+
+  Vecteurs propres
+
+   0.000000   2.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+    Valeurs pp de S2
+   0.000000000000   2.000000000000
+
+    Nbre de conf S, Sz            1
+   -0.707107
+    0.707107
+ --------------------------------------------
+
+  Ref0 finaux 
+    1   :   0011 1100
+    2   :   0101 1010
+    3   :   0110 1001
+    4   :   1001 0110
+    5   :   1010 0101
+    6   :   1100 0011
+    7   :   1010 1100
+    8   :   1100 1010
+    9   :   0110 1100
+   10   :   1100 0110
+   11   :   0110 1010
+   12   :   1010 0110
+   13   :   1001 1100
+   14   :   1100 1001
+   15   :   0101 1100
+   16   :   1100 0101
+   17   :   0101 1001
+   18   :   1001 0101
+   19   :   1001 1010
+   20   :   1010 1001
+   21   :   0011 1001
+   22   :   1001 0011
+   23   :   0011 1010
+   24   :   1010 0011
+   25   :   0011 0101
+   26   :   0101 0011
+   27   :   0101 0110
+   28   :   0110 0101
+   29   :   0011 0110
+   30   :   0110 0011
+  Nbre de det Ref1 (debug) : 1020
+  Nbre de det Ref1 CAS -> CAS :    6
+  Nbre de det Ref1 ligo-> CAS :   48
+  Nbre de det Ref1 CAS -> ligv:   48
+  Nbre de det Ref1 ligo-> ligv:   60
+  Nbre de det Ref1 ligo-> ligv + ech :   44
+  Nbre de det Ref1 ligo-> ligv tot:  104
+  Ref1 Cas  -> Cas  :    1 ->     6
+===
+Active determinant list R_-2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+===
+Active determinant list R_-1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_0
+Contains 70 determinants
+           0           2          -2           4          -4
+          36          16          16           1           1
+===
+Active determinant list R_1
+Contains 56 determinants
+           1          -1           3          -3
+          24          24           4           4
+===
+Active determinant list R_2
+Contains 28 determinants
+           0           2          -2
+          16           6           6
+  >>> Generation of D0
+  Nb of determinants in D  0 =                                       36
+  >>> Determinant block D0 generated in     0.00 second(s)
+  >>> Generation of D1
+  Nb of determinants in D  1 =                                     1560
+  >>> Determinant block D1 generated in     0.00 second(s)
+  >>> Determinant block D2 not generated for DDCI calculation
+  >>> Generation of D11
+  Nb of determinants in D 11 =                                      144
+  >>> Determinant block D11 generated in     0.00 second(s)
+  >>> Generation of D12
+  Nb of determinants in D 12 =                                     1760
+  >>> Determinant block D12 generated in     0.00 second(s)
+  >>> Generation of D-11
+  Nb of determinants in D-11 =                                      240
+  >>> Determinant block D-11 generated in     0.00 second(s)
+  >>> Generation of D-12
+  Nb of determinants in D-12 =                                     1968
+  >>> Determinant block D-12 generated in     0.00 second(s)
+  >>> Generation of D20
+  Nb of determinants in D 20 =                                      104
+  >>> Determinant block D20 generated in     0.00 second(s)
+  >>> Generation of D-20
+  Nb of determinants in D-20 =                                      192
+  >>> Determinant block D-20 generated in     0.00 second(s)
+  Total Nb of determinant                                          6004
+ >>>Determinants generated in   4.8000000000000001E-002 second(s)
+
+ >>> Lecture des integrales TraOne et TraInt
+  >>> Lecture des integrales TraOne
+      Ouverture TraOne = cuo.TraOne
+  Lecture TraOne en entiers 64 bits
+  Potnuc =        -449.56085922
+  Nombre d'irrep lu ds TraOne =  1
+  BSLbl = 
+    Irrep =  1
+         1  CU01  1s  
+         2  CU01  2px 
+         3  CU01  2px 
+         4  CU01  2py 
+         5  CU01  2py 
+         6  CU01  2pz 
+         7  CU01  2pz 
+         8  CU01  3d2-
+         9  CU01  3d2-
+        10  CU01  3d1-
+        11  CU01  3d1-
+        12  CU01  3d0 
+        13  CU01  3d0 
+        14  CU01  3d1+
+        15  CU01  3d1+
+        16  CU01  3d2+
+        17  CU01  3d2+
+        18  CU02  1s  
+        19  CU02  2px 
+        20  CU02  2px 
+        21  CU02  2py 
+        22  CU02  2py 
+        23  CU02  2pz 
+        24  CU02  2pz 
+        25  CU02  3d2-
+        26  CU02  3d2-
+        27  CU02  3d1-
+        28  CU02  3d1-
+        29  CU02  3d0 
+        30  CU02  3d0 
+        31  CU02  3d1+
+        32  CU02  3d1+
+        33  CU02  3d2+
+        34  CU02  3d2+
+        35  O_03  1s  
+        36  O_03  2px 
+        37  O_03  2px 
+        38  O_03  2py 
+        39  O_03  2py 
+        40  O_03  2pz 
+        41  O_03  2pz 
+        42  O_03  3d2-
+        43  O_03  3d1-
+        44  O_03  3d0 
+        45  O_03  3d1+
+        46  O_03  3d2+
+        47  O_04  1s  
+        48  O_04  2px 
+        49  O_04  2px 
+        50  O_04  2py 
+        51  O_04  2py 
+        52  O_04  2pz 
+        53  O_04  2pz 
+        54  O_04  3d2-
+        55  O_04  3d1-
+        56  O_04  3d0 
+        57  O_04  3d1+
+        58  O_04  3d2+
+        59  O_05  1s  
+        60  O_05  2px 
+        61  O_05  2px 
+        62  O_05  2py 
+        63  O_05  2py 
+        64  O_05  2pz 
+        65  O_05  2pz 
+        66  O_05  3d2-
+        67  O_05  3d1-
+        68  O_05  3d0 
+        69  O_05  3d1+
+        70  O_05  3d2+
+        71  O_06  1s  
+        72  O_06  2px 
+        73  O_06  2px 
+        74  O_06  2py 
+        75  O_06  2py 
+        76  O_06  2pz 
+        77  O_06  2pz 
+        78  O_06  3d2-
+        79  O_06  3d1-
+        80  O_06  3d0 
+        81  O_06  3d1+
+        82  O_06  3d2+
+        83  O_07  1s  
+        84  O_07  2px 
+        85  O_07  2px 
+        86  O_07  2py 
+        87  O_07  2py 
+        88  O_07  2pz 
+        89  O_07  2pz 
+        90  O_07  3d2-
+        91  O_07  3d1-
+        92  O_07  3d0 
+        93  O_07  3d1+
+        94  O_07  3d2+
+        95  O_08  1s  
+        96  O_08  2px 
+        97  O_08  2px 
+        98  O_08  2py 
+        99  O_08  2py 
+       100  O_08  2pz 
+       101  O_08  2pz 
+       102  O_08  3d2-
+       103  O_08  3d1-
+       104  O_08  3d0 
+       105  O_08  3d1+
+       106  O_08  3d2+
+       107  O_09  1s  
+       108  O_09  2px 
+       109  O_09  2px 
+       110  O_09  2py 
+       111  O_09  2py 
+       112  O_09  2pz 
+       113  O_09  2pz 
+       114  O_09  3d2-
+       115  O_09  3d1-
+       116  O_09  3d0 
+       117  O_09  3d1+
+       118  O_09  3d2+
+  Nombre d'integrales a lire =           78
+  Nombre d'integrales mono-electroniques lues  =           78
+
+  >>> Lecture des integrales TraInt
+      Ouverture TraInt = cuo.TraInt
+  Lecture TraInt en entiers 64 bits
+  Total nb of 2e- integrals           3081
+  (oo|oo)                               21
+  (ao|oo)                               72
+  (aa|oo) and (ao|ao)                  138
+  (aa|ao)                              120
+  (aa|aa)                               55
+  (vo|oo)                               90
+  (va|oo) and (vo|ao)                  300
+  (va|ao) and (vo|aa)                  390
+  (va|aa)                              200
+  (vv|oo) and (vo|vo)                  210
+  (vv|ao), and (va|vo)                 480
+  (vv|aa) and (va|va)                  360
+  (vv|vo)                              225
+  (vv|va)                              300
+  (vv|vv)                              120
+  gelees                                 0
+ >>> Integrals read in   8.0000000000000002E-003 second(s)
+
+ >>> Construction of the Fock matrix
+ >>> Fock matrix built in   0.0000000000000000      second(s)
+
+  One-electron energy =   -13.247675800429850     
+  Two-electron energy =    3.2986676825230550     
+  E0                  =   -9.9490081179067946     
+  Pot. Nuc.           =   -449.56085922003842     
+  Total E             =   -459.50986733794520     
+
+ >>> Construction of the diagonal of the Hamiltonian matrix (gen)
+ >>> Hdiag(gen) built in CPU time:    0.020000 second(s)  Wall time:    0.018000 second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Calculation of guess vectors
+ ----------------------------------------------------------------------------------------------------
+ >>> Build the matrix H0=<D00|H|D00>
+ >>> H0 diagonalised in   0.0000000000000000      second(s)
+
+ ----------------------------------------------------------------------------------------------------
+ >>> Diagonalisation
+ ----------------------------------------------------------------------------------------------------
+
+ =================================================================
+ >>> Davidson Diagonalisation 
+   Search for 2 vectors with a convergence threshold of  1.0E-05
+
+
+  #Iter     tCPU (s)    tWall (s)  Energies
+      0       0.0000       0.0000   -462.5452856260    -462.5452132936
+
+  Vecteurs propres
+
+  -3.035418  -3.035346
+
+   1.000000   0.000000
+   0.000000   1.000000
+      1       0.9240       0.9290   -462.5452856260    -462.5452132936
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.740868   0.671650
+   0.671650   0.740868
+
+  Vecteurs propres
+
+  -3.035875  -3.035807  -2.071542  -2.064179
+
+   0.999765   0.000000  -0.000000  -0.021689
+   0.000000  -0.999761  -0.021861   0.000000
+   0.021689   0.000000   0.000000   0.999765
+   0.000000  -0.021861   0.999761  -0.000000
+      2       0.7640       0.7680   -462.5457427090    -462.5456741369
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.706059  -0.708153
+  -0.708153   0.706059
+
+  Vecteurs propres
+
+  -3.035897  -3.035830  -2.194374  -2.193073  -2.008298  -1.996948
+
+  -0.999743  -0.000000  -0.016882   0.000000  -0.000000   0.015154
+  -0.000000   0.999738   0.000000   0.017137   0.015158   0.000000
+  -0.022157  -0.000000   0.583328  -0.000000   0.000000  -0.811935
+  -0.000000   0.022318  -0.000000  -0.584807  -0.810865  -0.000000
+  -0.004867   0.000000   0.812061  -0.000000   0.000000   0.583552
+   0.000000  -0.005031   0.000000   0.810991  -0.585037   0.000000
+      3       0.7080       0.7110   -462.5457640250    -462.5456968667
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+   0.707018  -0.707196
+  -0.707196  -0.707018
+
+  Vecteurs propres
+
+  -3.035898  -3.035831  -2.342010  -2.339340  -2.044458  -2.032580  -1.903867  -1.831286
+
+   0.999739  -0.000000   0.012015  -0.000000  -0.000000   0.019447   0.000000   0.000383
+   0.000000   0.999734   0.000000   0.011930   0.019671   0.000000  -0.001393  -0.000000
+   0.022236  -0.000000  -0.334469   0.000000   0.000000  -0.934053  -0.000000  -0.123208
+   0.000000   0.022396  -0.000000  -0.329124  -0.925400  -0.000000   0.186578  -0.000000
+   0.005178   0.000000  -0.752081   0.000000   0.000000   0.186033  -0.000000   0.632249
+  -0.000000  -0.005305   0.000000   0.717265  -0.116729   0.000000   0.686933   0.000000
+  -0.001199  -0.000000   0.567768  -0.000000  -0.000000  -0.304233  -0.000000   0.764906
+  -0.000000   0.001222  -0.000000  -0.614057   0.360032  -0.000000   0.702360   0.000000
+      4       0.7600       0.7670   -462.5457654035    -462.5456982145
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707133  -0.707081
+  -0.707081   0.707133
+
+  Vecteurs propres
+
+  -3.035898  -3.035831  -2.501182  -2.486050  -2.075682  -2.062008  -2.014948  -1.994323  -1.808722  -1.579725
+
+   0.999737  -0.000000   0.009441   0.000000   0.000000  -0.018842   0.000000   0.009015   0.000000  -0.001160
+   0.000000   0.999733   0.000000  -0.009405  -0.018010  -0.000000  -0.010947   0.000000  -0.001500  -0.000000
+   0.022288  -0.000000  -0.245146  -0.000000  -0.000000   0.786494  -0.000000  -0.561004  -0.000000   0.078156
+   0.000000   0.022441  -0.000000   0.242650   0.722559   0.000000   0.635953  -0.000000   0.118699   0.000000
+   0.005271   0.000000  -0.534036   0.000000   0.000000   0.372634  -0.000000   0.724523   0.000000  -0.225806
+  -0.000000  -0.005392  -0.000000  -0.521080  -0.444943   0.000000   0.639476   0.000000   0.348630   0.000000
+  -0.001408   0.000000   0.641108  -0.000000   0.000000   0.331070  -0.000000   0.088264   0.000000  -0.686717
+  -0.000000   0.001385   0.000000   0.617631  -0.258881   0.000000  -0.079388  -0.000000   0.738382   0.000000
+   0.000522  -0.000000  -0.493559   0.000000  -0.000000  -0.364156  -0.000000  -0.390473   0.000000  -0.686528
+   0.000000   0.000543   0.000000   0.536694  -0.461075   0.000000   0.424514   0.000000  -0.564940  -0.000000
+      5       0.6960       0.7010   -462.5457656599    -462.5456984644
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707282  -0.706931
+  -0.706931   0.707282
+
+  Vecteurs propres
+
+  -3.035898  -3.035831  -2.553980  -2.543512  -2.100952  -2.076661  -2.073659  -2.034898  -2.014946  -1.890627
+
+  -0.999736  -0.000000   0.009040   0.000000   0.000000  -0.014408   0.000000  -0.014784   0.000000  -0.004440
+  -0.000000   0.999732   0.000000  -0.008884  -0.007456  -0.000000  -0.016673  -0.000000  -0.010949  -0.000000
+  -0.022301  -0.000000  -0.237488  -0.000000  -0.000000   0.522143  -0.000000   0.771437  -0.000000   0.271830
+  -0.000000   0.022455  -0.000000   0.228998   0.241207   0.000000   0.684913   0.000000   0.636357   0.000000
+  -0.005290   0.000000  -0.482715  -0.000000  -0.000000   0.618644  -0.000000  -0.407368   0.000000  -0.428062
+   0.000000  -0.005413   0.000000  -0.465207  -0.410705  -0.000000  -0.346632   0.000000   0.640939   0.000000
+   0.001431  -0.000000   0.591389   0.000000  -0.000000   0.144701  -0.000000   0.279354  -0.000000  -0.473501
+   0.000000   0.001432  -0.000000   0.621046  -0.115713  -0.000000  -0.225113  -0.000000  -0.078493   0.000000
+  -0.000564  -0.000000  -0.527176  -0.000000   0.000000  -0.448938   0.000000   0.131952  -0.000000   0.125448
+  -0.000000   0.000562  -0.000000   0.472795   0.247822  -0.000000  -0.551519   0.000000   0.421834  -0.000000
+  -0.000151   0.000000  -0.287834   0.000000   0.000000  -0.349221   0.000000   0.378507  -0.000000  -0.709162
+   0.000000   0.000190   0.000000   0.349042  -0.835631   0.000000   0.235826   0.000000   0.004740  -0.000000
+      6       0.8720       0.8800   -462.5457656832    -462.5456984958
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707107   0.707107
+   0.707107   0.707107
+
+  Vecteurs propres
+
+  -3.035898  -3.035831  -2.570461  -2.565746  -2.162827  -2.142475  -2.095117  -2.062572  -2.062073  -1.997428
+
+  -0.999736   0.000000   0.008799  -0.000000  -0.000000   0.004369   0.000000  -0.018244   0.000000  -0.009793
+  -0.000000  -0.999732   0.000000   0.008660   0.001878   0.000000  -0.011352  -0.000000  -0.015883  -0.000000
+  -0.022303   0.000000  -0.230905   0.000000   0.000000  -0.089531  -0.000000   0.769558  -0.000000   0.577580
+  -0.000000  -0.022458  -0.000000  -0.222928  -0.037526  -0.000000   0.381950   0.000000   0.725059   0.000000
+  -0.005294   0.000000  -0.468399   0.000000   0.000000  -0.411666  -0.000000   0.335137  -0.000000  -0.644545
+   0.000000   0.005420   0.000000   0.455713   0.133057   0.000000  -0.559380  -0.000000  -0.039968   0.000000
+   0.001434  -0.000000   0.567685  -0.000000  -0.000000   0.262340   0.000000   0.358117  -0.000000  -0.096820
+   0.000000  -0.001431  -0.000000  -0.561122  -0.412854  -0.000000  -0.055518  -0.000000  -0.372288   0.000000
+  -0.000567   0.000000  -0.513272   0.000000  -0.000000   0.096684   0.000000  -0.359357   0.000000   0.364169
+  -0.000000  -0.000578  -0.000000  -0.514914   0.505594   0.000000  -0.054071  -0.000000  -0.320308   0.000000
+  -0.000162   0.000000  -0.338903   0.000000  -0.000000   0.649739   0.000000   0.068589  -0.000000  -0.060454
+   0.000000  -0.000196  -0.000000  -0.346509  -0.291371  -0.000000  -0.712223   0.000000   0.418251  -0.000000
+   0.000043  -0.000000   0.163212  -0.000000   0.000000  -0.567596  -0.000000  -0.181774   0.000000   0.324375
+   0.000000  -0.000061  -0.000000  -0.206133   0.685502   0.000000  -0.166769   0.000000   0.237297  -0.000000
+      7       0.7480       0.7550   -462.5457656852    -462.5456984995
+
+  Vecteurs propres
+
+   1.000000   1.000000
+
+  -0.707108  -0.707105
+  -0.707105   0.707108
+
+  Vecteurs propres
+
+  -3.035898  -3.035831  -2.580491  -2.578083  -2.314751  -2.245954  -2.161016  -2.075765  -2.067769  -2.035568
+
+   0.999736   0.000000   0.008334   0.000000  -0.004655   0.000000   0.000000   0.000000   0.016112   0.012179
+   0.000000  -0.999732   0.000000  -0.008298  -0.000000  -0.004542  -0.000857   0.017916  -0.000000   0.000000
+   0.022302   0.000000  -0.215647  -0.000000   0.139214  -0.000000  -0.000000  -0.000000  -0.621075  -0.673098
+   0.000000  -0.022458  -0.000000   0.211994   0.000000   0.127803   0.008942  -0.713895   0.000000  -0.000000
+   0.005295  -0.000000  -0.450979  -0.000000   0.220589  -0.000000  -0.000000  -0.000000  -0.546715   0.513283
+  -0.000000   0.005421   0.000000  -0.437881  -0.000000  -0.247665  -0.070513   0.471033  -0.000000  -0.000000
+  -0.001435  -0.000000   0.543122   0.000000  -0.275866   0.000000   0.000000  -0.000000  -0.253579  -0.206255
+  -0.000000  -0.001434  -0.000000   0.550539   0.000000   0.215058   0.380393   0.312404  -0.000000   0.000000
+   0.000568   0.000000  -0.497646  -0.000000   0.132003  -0.000000   0.000000   0.000000   0.444431  -0.214554
+   0.000000  -0.000577  -0.000000   0.479291  -0.000000   0.255987  -0.549647   0.355975  -0.000000  -0.000000
+   0.000164  -0.000000  -0.358522  -0.000000  -0.299987   0.000000   0.000000   0.000000   0.173950  -0.371199
+  -0.000000  -0.000200  -0.000000   0.378050   0.000000  -0.423667   0.419858   0.150856  -0.000000   0.000000
+  -0.000049   0.000000   0.238491   0.000000   0.621911  -0.000000  -0.000000   0.000000   0.098698  -0.026982
+  -0.000000  -0.000066  -0.000000   0.248203  -0.000000  -0.445939  -0.604744  -0.101289  -0.000000   0.000000
+  -0.000017   0.000000   0.148310   0.000000   0.601370  -0.000000   0.000000  -0.000000   0.115268  -0.237150
+   0.000000   0.000022   0.000000  -0.160966   0.000000   0.657399  -0.078359   0.104064  -0.000000  -0.000000
+      8       0.9280       0.9310   -462.5457656855    -462.5456984999
+  The vectors            1           2  seem congerved : we take them out
+    
+ >>> Davidson procedure converged on vectors corrections at 1.0E-10 <<<
+ >>> Convergence reached after            7  iterations <<<
+    
+  Overlap matrix between final vectors (difference to Id) 
+        0.910383E-14   -0.102625E-15
+       -0.102625E-15    0.399680E-14
+
+ Energies :   -462.545765685514255    -462.545698499914408
+ E ss ref :     -3.035898347569034      -3.035831161969198
+ dE (a.u.):      0.000000000000000       0.000067185599837
+ dE (meV) :      0.000000000000000       1.828213307329512
+ |Hv-Ev|  :             5.8149E-06              7.7879E-06
+ deltaE   :            -2.6996E-10             -4.4353E-10
+
+ Maximum precision expected on |Hv-Ev|   : 0.3D-07
+ Maximum precision expected on <v|H|v>-E : 0.1D-14
+
+ Calculation finished in CPUtime             7.48s Walltime:             8.35s
+ Calculation finished on 26-11-2019 at 14:04
diff --git a/test/CuO_DDCI/test b/test/CuO_DDCI/test
new file mode 100755
index 0000000000000000000000000000000000000000..e4815341b5b69aee49e4cf2de6db1ecc5cfb5310
--- /dev/null
+++ b/test/CuO_DDCI/test
@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
+sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
+
+from runtest_relaxse import Filter, TestRun
+
+test = TestRun(__file__, sys.argv)
+
+f = Filter()
+
+f.add(string = 'Energies :',
+      abs_tolerance = 1.0e-6)
+
+f.add(string = '|Hv-Ev|  :',
+      abs_tolerance = 1.0e-7)
+
+test.run(['cuo.input'], {'out': f})
+
+sys.exit(test.return_code)
diff --git a/test/detact_test.f90 b/test/detact_test.f90
new file mode 100644
index 0000000000000000000000000000000000000000..c82fe16632286b4d08b1dcf0a62c1ba4eef1983c
--- /dev/null
+++ b/test/detact_test.f90
@@ -0,0 +1,65 @@
+program detact_test
+
+  use dimensions
+  use detact
+  use utils_wrt
+  use info
+  
+  implicit none
+
+  type(o_infotype)  :: o_info
+  type(detact_list) :: R1
+  type(detact_list),pointer :: rtmp,r00
+  type(rlist) :: r
+  integer(kind=kindact), pointer :: detact_array(:)
+  integer(kindact) :: i
+  integer :: ndet = 1000, indx
+  integer(kindact) :: diffa, diffb, and_ab
+  
+  integer :: nact, sign_ab
+
+  o_info%nact = 8
+  
+  allocate(detact_array(ndet))
+  do i=1,ndet
+     detact_array(i) = i
+     !call wrtact(detact_array(i), 6, .false., nact)
+  enddo
+
+  
+  call sign_diff(detact_array(89), detact_array(53), diffa, diffb, and_ab, sign_ab, o_info%nact)
+  
+  call detact_list_init(R1, 0, 0, 9)
+  call fill_detact_list(R1, detact_array, ndet)
+  call detact_list_free(R1)
+
+  call detact_all_init(r,9)
+  
+  rtmp => get_detact(r,0,0)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,0,1)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,0,2)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,1,0)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,1,1)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,2,0)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,-1,0)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,-1,1)
+  call fill_detact_list(rtmp, detact_array, ndet)
+  rtmp => get_detact(r,-2,0)
+  call fill_detact_list(rtmp, detact_array, ndet)
+
+  r00 => get_detact(r,0)
+  
+  !call detact_all_connect(r, o_info)
+  call detact_all_free(r)
+
+  deallocate(detact_array)
+  
+end program detact_test
+ 
diff --git a/test/deter_test.f90 b/test/deter_test.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0964be0930feb3486b5c5741117d62be3b06ebc7
--- /dev/null
+++ b/test/deter_test.f90
@@ -0,0 +1,32 @@
+program deter_test
+
+  use gener_ref0
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref
+  integer :: nref = 2, nact = 2
+  character*6, dimension(:), allocatable :: ref_tmp
+  
+  allocate(ref_tmp(2))
+  
+  call deter_init(ref, nref)
+
+  ref_tmp(1) = '    5u'
+  ref_tmp(2) = '    6d'
+  call add2ref0(ref_tmp, ref, 1, 4, 2, 2)
+
+  ref_tmp(1) = '    5d'
+  ref_tmp(2) = '    6u'
+  call add2ref0(ref_tmp, ref, 2, 4, 2, 2)
+  
+  call wrtdet(ref(1), 6, 0, 2, 2, 2, 2, 2, 0)
+  call wrtdet(ref(2), 6, 0, 2, 2, 2, 2, 2, 0)
+
+  call check_spin(ref,2,0,nact)
+  
+  call deter_free(ref)
+
+  deallocate(ref_tmp)
+  
+end program deter_test
diff --git a/test/diag_test.f90 b/test/diag_test.f90
new file mode 100644
index 0000000000000000000000000000000000000000..fd7bf4941ff5223c722b7924e1669886ac78ffbc
--- /dev/null
+++ b/test/diag_test.f90
@@ -0,0 +1,65 @@
+program diag_test
+
+  use dimensions
+  use utils_wrt
+
+  integer(kd_int) :: ndet = 8
+  double precision, dimension(:,:), allocatable :: S2, Vvp, tmp, Emat, S
+  double precision, dimension(:), allocatable :: Evp
+  integer :: info, iout
+  integer :: i, j
+
+  iout = 6
+  
+
+  allocate(S2(ndet,ndet))
+  allocate(Vvp(ndet,ndet))
+  allocate(tmp(ndet,ndet))
+  allocate(Emat(ndet,ndet))
+  allocate(Evp(ndet))
+  allocate(S(ndet,ndet))
+
+  Vvp(:,:)    = 0.d0
+  Evp(:)      = 0.d0
+ 
+  do i=1,ndet
+     S2(i,i) = 13.0d0
+     do j=i+1,ndet
+        S2(i,j) = 1.0d0
+        S2(j,i) = S2(i,j)
+     enddo
+  enddo
+
+  call diag(S2,Evp,Vvp,ndet,2,iout,info)
+
+ 
+  S(:,:) = 0.d0
+  do i=1,ndet
+     S(i,i) = 1.0d0
+  enddo
+  call dgemm('T','N',ndet,ndet,ndet,1.0d0,Vvp,ndet,Vvp,ndet,-1.0d0,S,ndet)
+  if (sum(S)/(ndet*ndet) .gt. 1.0d-12) then
+     stop 'Non-orthogonal eigenvectors'
+  endif
+
+  Emat(:,:) = 0.d0
+  do i=1,ndet
+     Emat(i,i) = Evp(i)
+  enddo
+
+  tmp(:,:) = 0.d0
+  call dgemm('N','N',ndet,ndet,ndet,1.0d0,S2,ndet,Vvp,ndet,0.0d0,tmp,ndet)
+  call dgemm('N','N',ndet,ndet,ndet,1.0d0,Vvp,ndet,Emat,ndet,-1.0d0,tmp,ndet)
+
+  if (sum(tmp)/(ndet*ndet) .gt. 1.0d-12) then
+     stop 'diag problem'
+  endif
+  
+  deallocate(S2)
+  deallocate(Vvp)
+  deallocate(Evp)
+  deallocate(Emat)
+  deallocate(tmp)
+  deallocate(S)
+  
+end program diag_test
diff --git a/test/gener_ref.f90 b/test/gener_ref.f90
new file mode 100644
index 0000000000000000000000000000000000000000..0ddb9cb7ef39e0303ea76c80367557dcb56dfd23
--- /dev/null
+++ b/test/gener_ref.f90
@@ -0,0 +1,105 @@
+program ref0_test
+
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref0, det
+  character*6, dimension(:), allocatable :: ref_tmp
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  type(o_infotype)    :: o_info
+  type(det_infotype)  :: det_info
+  type(v_infotype)    :: v_info
+  type(prog_infotype) :: prog_info
+
+  integer :: nsft, nelact, i
+  type(deter_dblocklist) :: d
+  
+  nelact = 2
+  
+  !o_info
+  o_info%ntot  = 7
+  o_info%ngel  = 0
+  o_info%nocc  = 2
+  o_info%nligo = 0
+  o_info%nact  = 3
+  o_info%nligv = 0
+  o_info%nvirt = 2
+  o_info%ndel  = 0
+
+  ! v_info
+  v_info%stot = 1
+  v_info%sz   = 0
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 
+
+  ! det_info
+  det_info%nref0 = 2  
+  det_info%nref1 = 0 
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+
+  ! prog_info
+  prog_info%Yprefix =.false.
+  prog_info%print_det = .false.
+  prog_info%prt_cipci = .false.
+  prog_info%methodAct = 'SAS'
+  prog_info%methodExc = 'S'
+  prog_info%method = 'SAS+S'
+  prog_info%prefix = '                                        '
+  prog_info%restart = .false.
+  prog_info%nb_cpu = 1
+  prog_info%id_cpu = 0
+  prog_info%nb_thread = 1
+  prog_info%lexplicit = .false.
+  prog_info%lreadHmat = .false.
+  
+  nsft = o_info%nocc + o_info%nligo
+  
+  call deter_init(ref0, det_info%nref0)
+
+  allocate(ref_tmp(2))  
+  ref_tmp(1) = '    3u'
+  ref_tmp(2) = '    4d'
+  call add2ref0(ref_tmp, ref0, 1, nsft, nelact, o_info%nact)
+
+  ref_tmp(1) = '    3d'
+  ref_tmp(2) = '    4u'
+  call add2ref0(ref_tmp, ref0, 2, nsft, nelact, o_info%nact)
+  deallocate(ref_tmp)
+
+  call check_spin(ref0, det_info%nref0, v_info%sz, o_info%nact)
+
+  call detact_all_init(r, nb_rlist)
+
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  call generspin_ref1(ref0, r, o_info, det_info, nelact, prog_info)
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, .true.)
+
+  call deter_init(det, det_info%ndet)
+  call fill_detd(det, d)
+  do i =1,det_info%ndet
+     write(f_det,'(1x,i10,": ")',advance="no") i
+     call wrtdet(det(i), f_det, o_info)
+  enddo
+  call deter_free(det)
+    
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_free(ref0)
+  
+  call deter_blocklist_free(d)
+  
+end program ref0_test
diff --git a/test/gener_ref11211.f90 b/test/gener_ref11211.f90
new file mode 100644
index 0000000000000000000000000000000000000000..a09ded525f1a8abd84ec592ed6c915eab35169cb
--- /dev/null
+++ b/test/gener_ref11211.f90
@@ -0,0 +1,81 @@
+program ref0_test
+
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  use spindetact
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref0
+  character*6, dimension(:), allocatable :: ref_tmp
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  type(o_infotype)    :: o_info
+  type(det_infotype)  :: det_info
+  type(v_infotype)    :: v_info
+  type(prog_infotype) :: prog_info
+
+  integer :: nsft, nelact
+  type(deter_dblocklist) :: d
+
+  nelact = 2
+  
+  !o_info
+  o_info%ntot  = 6
+  o_info%ngel  = 0
+  o_info%nocc  = 1
+  o_info%nligo = 1
+  o_info%nact  = 2
+  o_info%nligv = 1
+  o_info%nvirt = 1
+  o_info%ndel  = 0
+
+  ! v_info
+  v_info%stot = 1
+  v_info%sz   = 0
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 
+
+  ! det_info
+  det_info%nref0 = 1  
+  det_info%nref1 = 0 
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+
+  ! prog_info
+  prog_info%id_cpu = 0
+  prog_info%print_det = .false.
+  nsft = o_info%nocc + o_info%nligo
+  
+  call deter_init(ref0, det_info%nref0)
+
+  allocate(ref_tmp(2))  
+  ref_tmp(1) = '    3u'
+  ref_tmp(2) = '    4d'
+  call add2ref0(ref_tmp, ref0, 1, nsft, nelact, o_info%nact)
+
+  deallocate(ref_tmp)
+
+  call check_spin(ref0, det_info%nref0, v_info%sz, o_info%nact)
+
+  call detact_all_init(r, nb_rlist)
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  call generspin_ref1(ref0, r, o_info, det_info, nelact,prog_info)
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, .false.)
+    
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_free(ref0)
+  call deter_blocklist_free(d)
+  
+end program ref0_test
diff --git a/test/gener_ref11211_uu.f90 b/test/gener_ref11211_uu.f90
new file mode 100644
index 0000000000000000000000000000000000000000..f7356b74e3ace2b1c42a7c4595c1a92bdc5d4c51
--- /dev/null
+++ b/test/gener_ref11211_uu.f90
@@ -0,0 +1,84 @@
+program ref0_test
+
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref0
+  character*6, dimension(:), allocatable :: ref_tmp
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  type(o_infotype)    :: o_info
+  type(det_infotype)  :: det_info
+  type(v_infotype)    :: v_info
+  type(prog_infotype) :: prog_info
+
+  integer :: nsft, nelact
+  
+  type(deter_dblocklist) :: d
+
+  nelact = 2
+  
+  !o_info
+  o_info%ntot  = 6
+  o_info%ngel  = 0
+  o_info%nocc  = 1
+  o_info%nligo = 1
+  o_info%nact  = 2
+  o_info%nligv = 1
+  o_info%nvirt = 1
+  o_info%ndel  = 0
+
+  ! v_info
+  v_info%stot = 3
+  v_info%sz   = 2
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 
+
+  ! det_info
+  det_info%nref0 = 1  
+  det_info%nref1 = 0 
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+  
+  ! prog_info
+  prog_info%id_cpu = 0
+  prog_info%print_det = .false.
+  
+  nsft = o_info%nocc + o_info%nligo
+  
+  call deter_init(ref0, det_info%nref0)
+
+  allocate(ref_tmp(2))  
+  ref_tmp(1) = '    3u'
+  ref_tmp(2) = '    4u'
+  call add2ref0(ref_tmp, ref0, 1, nsft, nelact, o_info%nact)
+
+  deallocate(ref_tmp)
+
+  call check_spin(ref0, det_info%nref0, v_info%sz, o_info%nact)
+
+  call detact_all_init(r, nb_rlist)
+
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  call generspin_ref1(ref0, r, o_info, det_info, nelact,prog_info)
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, .false.)
+    
+  deallocate(vecref0)
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_free(ref0)
+  call deter_blocklist_free(d)
+  
+end program ref0_test
diff --git a/test/gener_ref2.f90 b/test/gener_ref2.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4d5c399d216baba16e450bf9391aafeb650a3ff6
--- /dev/null
+++ b/test/gener_ref2.f90
@@ -0,0 +1,85 @@
+program ref0_test
+
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref0
+  character*6, dimension(:), allocatable :: ref_tmp
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+   type(o_infotype)    :: o_info
+  type(det_infotype)  :: det_info
+  type(v_infotype)    :: v_info
+  type(prog_infotype) :: prog_info
+
+ 
+  integer :: nsft, nelact
+  type(deter_dblocklist) :: d
+
+  nelact = 3
+  
+  !o_info
+  o_info%ntot  = 7
+  o_info%ngel  = 0
+  o_info%nocc  = 1
+  o_info%nligo = 1
+  o_info%nact  = 4
+  o_info%nligv = 0
+  o_info%nvirt = 1
+  o_info%ndel  = 0
+
+  ! v_info
+  v_info%stot = 4
+  v_info%sz   = 3
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 
+
+  ! det_info
+  det_info%nref0 = 1  
+  det_info%nref1 = 0 
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+
+  ! prog_info
+  prog_info%id_cpu = 0
+  prog_info%print_det = .false.
+
+  nsft = o_info%nocc + o_info%nligo
+  
+  call deter_init(ref0, det_info%nref0)
+
+  allocate(ref_tmp(3))  
+  ref_tmp(1) = '    5u'
+  ref_tmp(2) = '    3u'
+  ref_tmp(3) = '    4u'
+  call add2ref0(ref_tmp, ref0, 1, nsft, nelact, o_info%nact)
+
+  deallocate(ref_tmp)
+
+  call check_spin(ref0, det_info%nref0, v_info%sz, o_info%nact)
+
+  call detact_all_init(r, nb_rlist)
+
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  call generspin_ref1(ref0, r, o_info, det_info, nelact,prog_info)
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, .false.)
+    
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_free(ref0)
+    
+  call deter_blocklist_free(d)
+  
+end program ref0_test
diff --git a/test/gener_ref44422.f90 b/test/gener_ref44422.f90
new file mode 100644
index 0000000000000000000000000000000000000000..778ea4aa2d41a2eb85a274d829e955db7b0f903c
--- /dev/null
+++ b/test/gener_ref44422.f90
@@ -0,0 +1,99 @@
+program monos_test
+
+  use gener_ref0
+  use gener_ref1
+  use gener_monos
+  use spindetact
+  
+  implicit none
+
+  type(deter), dimension(:), allocatable :: ref0
+  
+  character*6, dimension(:), allocatable :: ref_tmp
+  type(rlist) :: r
+  type(spinrlist) :: rspin
+  integer, parameter :: nb_rlist = 9
+  !real (KIND=kd_dble), dimension(:,:), allocatable :: vecref0
+  type(o_infotype)    :: o_info
+  type(det_infotype)  :: det_info
+  type(v_infotype)    :: v_info
+ 
+  type(prog_infotype) :: prog_info
+
+  integer :: nsft, nelact
+  type(deter_dblocklist) :: d
+
+  nelact = 4
+  
+  !o_info
+ 
+  o_info%ngel  = 0
+  o_info%nocc  = 4
+  o_info%nligo = 4
+  o_info%nact  = 4
+  o_info%nligv = 2
+  o_info%nvirt = 2
+  o_info%ndel  = 0
+
+  o_info%ntot  = o_info%ngel + o_info%nocc + o_info%nligo &
+       + o_info%nact + o_info%nligv + o_info%nvirt + o_info%ndel
+  
+  ! v_info
+  v_info%stot = 1
+  v_info%sz   = 0
+  v_info%vec_irrep = 1
+  v_info%nvec = 1
+  v_info%ncfspref0 = 0 
+
+  ! det_info
+  det_info%nref0 = 2  
+  det_info%nref1 = 0 
+  det_info%ndetcaslm = 0
+  det_info%ndet  = 1
+  det_info%ndet1  = 0
+  det_info%nmonoref0 = 0 
+  det_info%ndiref0   = 0
+
+  ! prog_info
+  prog_info%id_cpu = 0
+  prog_info%print_det = .false.
+  
+  nsft = o_info%nocc + o_info%nligo
+  
+  call deter_init(ref0, det_info%nref0)
+
+  allocate(ref_tmp(4))  
+  ref_tmp(1) = '    9u'
+  ref_tmp(2) = '   10d'
+  ref_tmp(3) = '   11d'
+  ref_tmp(4) = '   12u'
+  call add2ref0(ref_tmp, ref0, 1, nsft, nelact, o_info%nact)
+
+  ref_tmp(1) = '    9u'
+  ref_tmp(2) = '   10u'
+  ref_tmp(3) = '   11d'
+  ref_tmp(4) = '   12d'
+  
+  call add2ref0(ref_tmp, ref0, 2, nsft, nelact, o_info%nact)
+  deallocate(ref_tmp)
+
+  call check_spin(ref0, det_info%nref0, v_info%sz, o_info%nact)
+
+  call detact_all_init(r, nb_rlist)
+
+  call generspin_ref0(ref0, vecref0, r, o_info, det_info, v_info, prog_info)
+  call generspin_ref1(ref0, r, o_info, det_info, nelact,prog_info)
+  call compute_all_spindetact(rspin, r, o_info, v_info%sz)
+  
+  call deter_blocklist_init(d)
+  call generspin_det(det_info, rspin, d, &
+       o_info, v_info, prog_info, .false.)
+    
+  deallocate(vecref0)
+  call detact_all_free(r)
+  call spindetact_all_free(rspin)
+  call deter_free(ref0)
+  call deter_blocklist_free(d)
+  
+  
+end program monos_test
diff --git a/test/hole_part_cases_test.f90 b/test/hole_part_cases_test.f90
new file mode 100644
index 0000000000000000000000000000000000000000..4de0e2a60113ea026da8d8e5769e61c082fd6d23
--- /dev/null
+++ b/test/hole_part_cases_test.f90
@@ -0,0 +1,39 @@
+module hole_part_cases_tests
+  use hole_part_cases
+  use info
+  implicit none
+contains
+
+  subroutine calc_hole_sign_test()
+    integer, parameter :: n = 7
+    integer :: h_index(n) = (/ 1, 14, 14, 15, 15, 20, 20 /)
+    integer :: h_i1(n) = (/ 1, 1, 1, 4, 4, 3, 2 /)
+    integer :: h_i2(n) = (/ 2, 2, 3, 3, 3, 1, 0 /)
+    integer :: h_j1(n) = (/ 3, 3, 3, 2, 2, 1, 0 /)
+    integer :: h_j2(n) = (/ 4, 4, 4, 1, 2, 1, 0 /)
+    integer :: exp_sign(n) = (/ 1, -1, 1, 1, -1, -1, 1 /)
+    type(case_infotype), allocatable :: h(:)
+    integer :: i
+
+    allocate(h(num_cases))
+    call gener_hole_case_info(h)
+
+    do i = 1, n
+       if (calc_hole_sign(h(h_index(i)), h_i1(i), h_i2(i), h_j1(i), h_j2(i)) /= exp_sign(i)) then
+          print *, 'i =', i
+          stop 'FAIL: calc_hole_sign_test'
+       end if
+    end do
+
+    deallocate(h)
+  end subroutine calc_hole_sign_test
+  
+end module hole_part_cases_tests
+
+
+program hole_part_cases_test
+  use hole_part_cases_tests
+
+  call calc_hole_sign_test()
+  
+end program hole_part_cases_test
diff --git a/test/runtest/__init__.py b/test/runtest/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e15637bbba621354ac1565fad53a3ecb8198e0ba
--- /dev/null
+++ b/test/runtest/__init__.py
@@ -0,0 +1,13 @@
+from .filter_constructor import get_filter
+from .run import run
+from .version import version_info, __version__
+from .cli import cli
+
+__author__ = ('Radovan Bast <radovan.bast@uit.no>')
+
+__all__ = [
+    'get_filter',
+    'version_info',
+    'run',
+    'cli',
+]
diff --git a/test/runtest/check.py b/test/runtest/check.py
new file mode 100644
index 0000000000000000000000000000000000000000..8fa2938b1b4f840b6725feb693962318ab306c1b
--- /dev/null
+++ b/test/runtest/check.py
@@ -0,0 +1,347 @@
+def check(filter_list, out_name, ref_name, log_dir, verbose=False):
+    """
+    Compares output with reference applying all filters tasks from the list of
+    filters.
+
+    Input:
+        - filter_list -- list of filters
+        - out_name -- actual output file name
+        - ref_name -- reference output file name
+        - log_dir -- directory which will hold logs
+        - verbose  -- give verbose output upon failure
+
+    Returns:
+        - nothing
+
+    Generates the following files in log_dir:
+        - out_name.filtered  -- numbers extracted from output
+        - out_name.reference -- numbers extracted from reference
+        - out_name.diff      -- difference between the two above
+
+    Raises:
+        - FailedTestError
+    """
+    import os
+    from .tuple_comparison import tuple_matches
+    from .extract import extract_numbers
+    from .scissors import cut_sections
+    from .exceptions import FilterKeywordError, FailedTestError, BadFilterError
+
+    def _tuple_matches(t):
+        if f.tolerance_is_relative:
+            error_definition = 'relative'
+        else:
+            error_definition = 'absolute'
+        return tuple_matches(t,
+                             tolerance=f.tolerance,
+                             error_definition=error_definition,
+                             ignore_sign=f.ignore_sign,
+                             skip_below=f.skip_below,
+                             skip_above=f.skip_above)
+
+    name_out = os.path.join(log_dir, out_name + '.filtered')
+    name_ref = os.path.join(log_dir, out_name + '.reference')
+    name_diff = os.path.join(log_dir, out_name + '.diff')
+
+    with open(name_out, 'w') as log_out:
+        with open(name_ref, 'w') as log_ref:
+            with open(name_diff, 'w') as log_diff:
+
+                for f in filter_list:
+
+                    out_filtered = cut_sections(open(out_name).readlines(),
+                                                from_string=f.from_string,
+                                                from_is_re=f.from_is_re,
+                                                to_string=f.to_string,
+                                                to_is_re=f.to_is_re,
+                                                num_lines=f.num_lines)
+                    if out_filtered == []:
+                        if f.num_lines > 0:
+                            r = '[%i lines from "%s"]' % (f.num_lines, f.from_string)
+                        else:
+                            r = '["%s" ... "%s"]' % (f.from_string, f.to_string)
+                        message = 'ERROR: filter %s did not extract anything from file %s\n' % (r, out_name)
+                        raise BadFilterError(message)
+
+                    log_out.write(''.join(out_filtered))
+                    out_numbers, out_locations = extract_numbers(out_filtered, f.mask)
+                    if f.mask is not None and out_numbers == []:
+                        raise FilterKeywordError('ERROR: mask %s did not extract any numbers\n' % f.mask)
+
+                    ref_filtered = cut_sections(open(ref_name).readlines(),
+                                                from_string=f.from_string,
+                                                from_is_re=f.from_is_re,
+                                                to_string=f.to_string,
+                                                to_is_re=f.to_is_re,
+                                                num_lines=f.num_lines)
+                    if ref_filtered == []:
+                        if f.num_lines > 0:
+                            r = '[%i lines from "%s"]' % (f.num_lines, f.from_string)
+                        else:
+                            r = '["%s" ... "%s"]' % (f.from_string, f.to_string)
+                        message = 'ERROR: filter %s did not extract anything from file %s\n' % (r, ref_name)
+                        raise BadFilterError(message)
+
+                    log_ref.write(''.join(ref_filtered))
+                    ref_numbers, _ = extract_numbers(ref_filtered, f.mask)
+                    if f.mask is not None and ref_numbers == []:
+                        raise FilterKeywordError('ERROR: mask %s did not extract any numbers\n' % f.mask)
+
+                    if f.ignore_order:
+                        out_numbers = sorted(out_numbers)
+                        ref_numbers = sorted(ref_numbers)
+
+                    if out_numbers == [] and ref_numbers == []:
+                        # no numbers are extracted
+                        if out_filtered != ref_filtered:
+                            log_diff.write('ERROR: extracted strings do not match\n')
+                            log_diff.write('own gave:\n')
+                            log_diff.write(''.join(out_filtered) + '\n')
+                            log_diff.write('reference gave:\n')
+                            log_diff.write(''.join(ref_filtered) + '\n')
+
+                    # we need to check for len(out_numbers) > 0
+                    # for pure strings len(out_numbers) is 0
+                    # TODO need to consider what to do with pure strings in future versions
+                    if len(out_numbers) == len(ref_numbers) and len(out_numbers) > 0:
+                        if not f.tolerance_is_set and (any(map(lambda x: isinstance(x, float), out_numbers)) or any(map(lambda x: isinstance(x, float), ref_numbers))):
+                            raise FilterKeywordError('ERROR: for floats you have to specify either rel_tolerance or abs_tolerance\n')
+                        l = map(_tuple_matches, zip(out_numbers, ref_numbers))
+                        matching, errors = zip(*l)  # unzip tuples to two lists
+                        if not all(matching):
+                            log_diff.write('\n')
+                            for k, line in enumerate(out_filtered):
+                                log_diff.write('.       %s' % line)
+                                for i, num in enumerate(out_numbers):
+                                    (line_num, start_char, length) = out_locations[i]
+                                    if line_num == k:
+                                        if errors[i]:
+                                            log_diff.write('ERROR   %s%s %s\n' % (' ' * start_char, '#' * length, errors[i]))
+
+                    if len(out_numbers) != len(ref_numbers):
+                        log_diff.write('ERROR: extracted sizes do not match\n')
+                        log_diff.write('own gave %i numbers:\n' % len(out_numbers))
+                        log_diff.write(''.join(out_filtered) + '\n')
+                        log_diff.write('reference gave %i numbers:\n' % len(ref_numbers))
+                        log_diff.write(''.join(ref_filtered) + '\n')
+
+    if os.path.getsize('%s.diff' % out_name) > 0:
+        log_diff = open('%s.diff' % out_name, 'r')
+        diff = ''
+        for line in log_diff.readlines():
+            diff += line
+        log_diff.close()
+        message = "ERROR: test %s failed\n" % out_name
+        if verbose:
+            message += diff
+        raise FailedTestError(message)
+
+
+def test_check():
+    import os
+    import pytest
+    from .exceptions import FilterKeywordError, FailedTestError
+    from .check import check
+    from .filter_constructor import get_filter
+
+    _here = os.path.abspath(os.path.dirname(__file__))
+    test_dir = os.path.join(_here, 'test', 'generic')
+    out_name = os.path.join(test_dir, 'out.txt')
+    ref_name = os.path.join(test_dir, 'ref.txt')
+    log_dir = test_dir
+
+    filters = [get_filter(abs_tolerance=0.1)]
+    check(filter_list=filters,
+          out_name=out_name,
+          ref_name=ref_name,
+          log_dir=log_dir,
+          verbose=False)
+
+    filters = [get_filter()]
+    with pytest.raises(FilterKeywordError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: for floats you have to specify either rel_tolerance or abs_tolerance\n' in str(e.value)
+
+    filters = [get_filter(rel_tolerance=0.01)]
+    with pytest.raises(FailedTestError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: test %s failed\n' % out_name in str(e.value)
+    with open(os.path.join(test_dir, 'out.txt.diff'), 'r') as f:
+        assert f.read() == '''
+.       1.0 2.0 3.0
+ERROR           ### expected: 3.05 (rel diff: 1.64e-02)\n'''
+
+    filters = [get_filter(abs_tolerance=0.01)]
+    with pytest.raises(FailedTestError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: test %s failed\n' % out_name in str(e.value)
+    with open(os.path.join(test_dir, 'out.txt.diff'), 'r') as f:
+        assert f.read() == '''
+.       1.0 2.0 3.0
+ERROR           ### expected: 3.05 (abs diff: 5.00e-02)\n'''
+
+    filters = [get_filter(abs_tolerance=0.01, ignore_sign=True)]
+    with pytest.raises(FailedTestError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: test %s failed\n' % out_name in str(e.value)
+    with open(os.path.join(test_dir, 'out.txt.diff'), 'r') as f:
+        assert f.read() == '''
+.       1.0 2.0 3.0
+ERROR           ### expected: 3.05 (abs diff: 5.00e-02 ignoring signs)\n'''
+
+
+def test_check_bad_filter():
+    import os
+    import pytest
+    from .exceptions import BadFilterError
+    from .check import check
+    from .filter_constructor import get_filter
+
+    _here = os.path.abspath(os.path.dirname(__file__))
+    test_dir = os.path.join(_here, 'test', 'generic')
+    out_name = os.path.join(test_dir, 'out.txt')
+    ref_name = os.path.join(test_dir, 'ref.txt')
+    log_dir = test_dir
+
+    filters = [get_filter(from_string='does not exist', num_lines=4)]
+    with pytest.raises(BadFilterError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: filter [4 lines from "does not exist"] did not extract anything from file %s\n' % out_name in str(e.value)
+
+    filters = [get_filter(from_string='does not exist', to_string="either")]
+    with pytest.raises(BadFilterError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: filter ["does not exist" ... "either"] did not extract anything from file %s\n' % out_name in str(e.value)
+
+
+def test_check_different_length():
+    import os
+    import pytest
+    from .exceptions import FailedTestError
+    from .check import check
+    from .filter_constructor import get_filter
+
+    _here = os.path.abspath(os.path.dirname(__file__))
+    test_dir = os.path.join(_here, 'test', 'different_length')
+    out_name = os.path.join(test_dir, 'out.txt')
+    ref_name = os.path.join(test_dir, 'ref.txt')
+    log_dir = test_dir
+
+    filters = [get_filter(abs_tolerance=0.1)]
+    with pytest.raises(FailedTestError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: test %s failed\n' % out_name in str(e.value)
+    with open(os.path.join(test_dir, 'out.txt.diff'), 'r') as f:
+        assert f.read() == '''ERROR: extracted sizes do not match
+own gave 4 numbers:
+1.0 2.0 3.0 4.0
+
+reference gave 3 numbers:
+1.0 2.0 3.05
+\n'''
+
+
+def test_check_ignore_order():
+    import os
+    import pytest
+    from .exceptions import FailedTestError
+    from .check import check
+    from .filter_constructor import get_filter
+
+    _here = os.path.abspath(os.path.dirname(__file__))
+    test_dir = os.path.join(_here, 'test', 'ignore_order')
+    out_name = os.path.join(test_dir, 'out.txt')
+    ref_name = os.path.join(test_dir, 'ref.txt')
+    log_dir = test_dir
+
+    filters = [get_filter(abs_tolerance=0.1)]
+    with pytest.raises(FailedTestError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: test %s failed\n' % out_name in str(e.value)
+
+    filters = [get_filter(abs_tolerance=0.1, ignore_order=True)]
+    check(filter_list=filters,
+          out_name=out_name,
+          ref_name=ref_name,
+          log_dir=log_dir,
+          verbose=False)
+
+
+def test_bad_keywords():
+    import os
+    import pytest
+    from .filter_api import recognized_kw
+    from .exceptions import FilterKeywordError
+    from .filter_constructor import get_filter
+
+    with pytest.raises(FilterKeywordError) as e:
+        _ = get_filter(raboof=0, foo=1)
+    exception = '''ERROR: keyword(s) (foo, raboof) not recognized
+       available keywords: ({0})\n'''.format(', '.join(recognized_kw))
+    assert exception in str(e.value)
+
+    with pytest.raises(FilterKeywordError) as e:
+        _ = get_filter(from_string='foo', from_re='foo', to_string='foo', to_re='foo')
+    assert "ERROR: incompatible keyword pairs: [('from_re', 'from_string'), ('to_re', 'to_string')]\n" in str(e.value)
+
+
+def test_only_string():
+    import os
+    import pytest
+    from .exceptions import BadFilterError
+    from .check import check
+    from .filter_constructor import get_filter
+
+    _here = os.path.abspath(os.path.dirname(__file__))
+    test_dir = os.path.join(_here, 'test', 'only_string')
+    out_name = os.path.join(test_dir, 'out.txt')
+    ref_name = os.path.join(test_dir, 'ref.txt')
+    log_dir = test_dir
+
+    filters = [get_filter(string='raboof')]
+    check(filter_list=filters,
+          out_name=out_name,
+          ref_name=ref_name,
+          log_dir=log_dir,
+          verbose=False)
+
+    filters = [get_filter(string='foo')]
+    with pytest.raises(BadFilterError) as e:
+        check(filter_list=filters,
+              out_name=out_name,
+              ref_name=ref_name,
+              log_dir=log_dir,
+              verbose=False)
+    assert 'ERROR: filter [1 lines from "foo"] did not extract anything from file %s\n' % out_name in str(e.value)
diff --git a/test/runtest/cli.py b/test/runtest/cli.py
new file mode 100644
index 0000000000000000000000000000000000000000..a7a104dbece7794ad8993efe8b0da584bd83b700
--- /dev/null
+++ b/test/runtest/cli.py
@@ -0,0 +1,44 @@
+def cli():
+
+    from optparse import OptionParser
+    import sys
+    import os
+    import inspect
+    from .version import __version__
+
+    frame = inspect.stack()[-1]
+    module = inspect.getmodule(frame[0])
+    caller_file = module.__file__
+    caller_dir = os.path.dirname(os.path.realpath(caller_file))
+
+    parser = OptionParser(description='runtest {0} - Numerically tolerant end-to-end test library for scientific codes.'.format(__version__))
+
+    parser.add_option('--binary-dir',
+                      '-b',
+                      action='store',
+                      default=caller_dir,
+                      help='directory containing the binary/launcher [default: %default]')
+    parser.add_option('--work-dir',
+                      '-w',
+                      action='store',
+                      default=caller_dir,
+                      help='working directory [default: %default]')
+    parser.add_option('--verbose',
+                      '-v',
+                      action='store_true',
+                      default=False,
+                      help='give more verbose output upon test failure [default: %default]')
+    parser.add_option('--skip-run',
+                      '-s',
+                      action='store_true',
+                      default=False,
+                      help='skip actual calculation(s) [default: %default]')
+    parser.add_option('--no-verification',
+                      '-n',
+                      action='store_true',
+                      default=False,
+                      help='run calculation(s) but do not verify results [default: %default]')
+
+    (options, args) = parser.parse_args(args=sys.argv[1:])
+
+    return options
diff --git a/test/runtest/copy.py b/test/runtest/copy.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f67df655ffd88a36342cbc93ffe296d826df76e
--- /dev/null
+++ b/test/runtest/copy.py
@@ -0,0 +1,14 @@
+def copy_path(root_src_dir, root_dst_dir, exclude_files=[]):
+
+    from shutil import copy
+    import os
+
+    for src_dir, dirs, files in os.walk(root_src_dir):
+        dst_dir = src_dir.replace(root_src_dir, root_dst_dir)
+        if not os.path.exists(dst_dir):
+            os.makedirs(dst_dir)
+        for f in files:
+            if f not in exclude_files:
+                src_file = os.path.join(src_dir, f)
+                dst_file = os.path.join(dst_dir, f)
+                copy(src_file, dst_file)
diff --git a/test/runtest/exceptions.py b/test/runtest/exceptions.py
new file mode 100644
index 0000000000000000000000000000000000000000..efafe328d0dcb73428b2a0e37bb7b75ec86ab31e
--- /dev/null
+++ b/test/runtest/exceptions.py
@@ -0,0 +1,10 @@
+class FilterKeywordError(Exception):
+    pass
+
+
+class FailedTestError(Exception):
+    pass
+
+
+class BadFilterError(Exception):
+    pass
diff --git a/test/runtest/extract.py b/test/runtest/extract.py
new file mode 100644
index 0000000000000000000000000000000000000000..fe825de33ecac7016b88e51d77b094825a03a6c7
--- /dev/null
+++ b/test/runtest/extract.py
@@ -0,0 +1,109 @@
+def extract_numbers(text, mask=None):
+    """
+    Extracts floats and integers from string text.
+
+    Returns:
+        numbers - list of numbers
+        locations - locations of each number as list of triples (line, start position, length)
+    """
+    import re
+
+    numeric_const_pattern = r"""
+    [-+]? # optional sign
+    (?:
+        (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc
+        |
+        (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc
+    )
+    # followed by optional exponent part if desired
+    (?: [EeDd] [+-]? \d+ ) ?
+    """
+
+    pattern_int = re.compile('^-?[0-9]+$', re.VERBOSE)
+    pattern_float = re.compile(numeric_const_pattern, re.VERBOSE)
+    pattern_d = re.compile(r'[dD]')
+
+    numbers = []
+    locations = []
+
+    for n, line in enumerate(text):
+        i = 0
+        for w in line.split():
+            # do not consider words like TzB1g
+            # otherwise we would extract 1 later
+            if re.match(r'^[0-9\.eEdD\+\-]*$', w):
+                i += 1
+                if mask is not None:
+                    if i not in mask:
+                        continue
+                is_integer = False
+                if len(pattern_float.findall(w)) > 0:
+                    is_integer = (pattern_float.findall(w) == pattern_int.findall(w))
+                # apply floating point regex
+                for m in pattern_float.findall(w):
+                    index = line.index(m)
+                    # substitute dD by e
+                    m = pattern_d.sub('e', m)
+                    if is_integer:
+                        numbers.append(int(m))
+                    else:
+                        numbers.append(float(m))
+                    locations.append((n, index, len(m)))
+
+    return numbers, locations
+
+
+def test_extract_numbers():
+
+    text = '''<<A( 3),B( 3)>> - linear response function (real):
+-----------------------------------------------------------------------------------------------
+   A - Z-Dipole length      B1u  T+
+   B - Z-Dipole length      B1u  T+
+-----------------------------------------------------------------------------------------------
+ Frequency (real)     Real part                                     Convergence
+-----------------------------------------------------------------------------------------------
+  0.00000000 a.u.   -1.901357604797 a.u.                       3.04E-07   (converged)
+-----------------------------------------------------------------------------------------------
+----------------------------------------------------------------------------
+
+
+                         +--------------------------------+
+                         ! Electric dipole polarizability !
+                         +--------------------------------+
+
+
+ 1 a.u =   0.14818471 angstrom**3
+
+
+@   Elements of the electric dipole polarizability tensor
+
+@   xx            1.90135760 a.u.   (converged)
+@   yy            1.90135760 a.u.   (converged)
+@   zz            1.90135760 a.u.   (converged)
+
+@   average       1.90135760 a.u.
+@   anisotropy    0.000      a.u.
+
+@   xx            0.28175212 angstrom**3
+@   yy            0.28175212 angstrom**3
+@   zz            0.28175212 angstrom**3
+
+@   average       0.28175212 angstrom**3
+@   anisotropy    0.000      angstrom**3'''
+
+    numbers, locations = extract_numbers(text.splitlines())
+
+    assert numbers == [0.0, -1.901357604797, 3.04e-07, 1, 0.14818471, 1.9013576, 1.9013576, 1.9013576, 1.9013576, 0.0, 0.28175212, 0.28175212, 0.28175212, 0.28175212, 0.0]
+    assert locations == [(7, 2, 10), (7, 20, 15), (7, 63, 8), (17, 1, 1), (17, 11, 10), (22, 18, 10), (23, 18, 10), (24, 18, 10), (26, 18, 10), (27, 18, 5), (29, 18, 10), (30, 18, 10), (31, 18, 10), (33, 18, 10), (34, 18, 5)]
+
+
+def test_extract_numbers_mask():
+
+    text = '''1.0 2.0 3.0 4.0
+1.0 2.0 3.0 4.0
+1.0 2.0 3.0 4.0'''
+
+    numbers, locations = extract_numbers(text.splitlines(), mask=[1, 4])
+
+    assert numbers == [1.0, 4.0, 1.0, 4.0, 1.0, 4.0]
+    assert locations == [(0, 0, 3), (0, 12, 3), (1, 0, 3), (1, 12, 3), (2, 0, 3), (2, 12, 3)]
diff --git a/test/runtest/filter_api.py b/test/runtest/filter_api.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ad865d1b8cda0c9df11052ebe0a152e2235e008
--- /dev/null
+++ b/test/runtest/filter_api.py
@@ -0,0 +1,34 @@
+recognized_kw = [
+    'from_re',
+    'to_re',
+    're',
+    'from_string',
+    'to_string',
+    'string',
+    'skip_below',
+    'skip_above',
+    'ignore_sign',
+    'ignore_order',
+    'mask',
+    'num_lines',
+    'rel_tolerance',
+    'abs_tolerance',
+]
+
+incompatible_pairs = [
+    ('from_re', 'from_string'),
+    ('to_re', 'to_string'),
+    ('to_string', 'num_lines'),
+    ('to_re', 'num_lines'),
+    ('string', 'from_string'),
+    ('string', 'to_string'),
+    ('string', 'from_re'),
+    ('string', 'to_re'),
+    ('string', 'num_lines'),
+    ('re', 'from_string'),
+    ('re', 'to_string'),
+    ('re', 'from_re'),
+    ('re', 'to_re'),
+    ('re', 'num_lines'),
+    ('rel_tolerance', 'abs_tolerance'),
+]
diff --git a/test/runtest/filter_constructor.py b/test/runtest/filter_constructor.py
new file mode 100644
index 0000000000000000000000000000000000000000..38fa922f5b31ab832f731a3c3f14c14694d2b218
--- /dev/null
+++ b/test/runtest/filter_constructor.py
@@ -0,0 +1,79 @@
+def get_filter(**kwargs):
+    import sys
+    from collections import namedtuple
+    from .exceptions import FilterKeywordError
+    from .filter_api import recognized_kw, incompatible_pairs
+
+    _filter = namedtuple('_filter',
+                         ['from_is_re',
+                          'from_string',
+                          'skip_above',
+                          'skip_below',
+                          'ignore_sign',
+                          'ignore_order',
+                          'mask',
+                          'num_lines',
+                          'to_is_re',
+                          'to_string',
+                          'tolerance',
+                          'tolerance_is_relative',
+                          'tolerance_is_set'])
+
+    unrecoginzed_kw = [kw for kw in kwargs.keys() if kw not in recognized_kw]
+    if unrecoginzed_kw != []:
+        error = '''ERROR: keyword(s) ({unrecognized}) not recognized
+       available keywords: ({available})\n'''.format(unrecognized=(', ').join(sorted(unrecoginzed_kw)),
+                                                     available=(', ').join(recognized_kw))
+        raise FilterKeywordError(error)
+
+    incompatible_kw = [(kw1, kw2) for (kw1, kw2) in incompatible_pairs if kw1 in kwargs.keys() and kw2 in kwargs.keys()]
+    if incompatible_kw != []:
+        error = 'ERROR: incompatible keyword pairs: {0}\n'.format(incompatible_kw)
+        raise FilterKeywordError(error)
+
+    # now continue with keywords
+    _filter.from_string = kwargs.get('from_string', None)
+    _filter.to_string = kwargs.get('to_string', None)
+    _filter.ignore_sign = kwargs.get('ignore_sign', False)
+    _filter.ignore_order = kwargs.get('ignore_order', False)
+    _filter.skip_below = kwargs.get('skip_below', sys.float_info.min)
+    _filter.skip_above = kwargs.get('skip_above', sys.float_info.max)
+    _filter.num_lines = kwargs.get('num_lines', 0)
+
+    if 'rel_tolerance' in kwargs.keys():
+        _filter.tolerance = kwargs.get('rel_tolerance')
+        _filter.tolerance_is_relative = True
+        _filter.tolerance_is_set = True
+    elif 'abs_tolerance' in kwargs.keys():
+        _filter.tolerance = kwargs.get('abs_tolerance')
+        _filter.tolerance_is_relative = False
+        _filter.tolerance_is_set = True
+    else:
+        _filter.tolerance_is_set = False
+
+    _filter.mask = kwargs.get('mask', None)
+
+    _filter.from_is_re = False
+    from_re = kwargs.get('from_re', '')
+    if from_re != '':
+        _filter.from_string = from_re
+        _filter.from_is_re = True
+
+    _filter.to_is_re = False
+    to_re = kwargs.get('to_re', '')
+    if to_re != '':
+        _filter.to_string = to_re
+        _filter.to_is_re = True
+
+    only_string = kwargs.get('string', '')
+    if only_string != '':
+        _filter.from_string = only_string
+        _filter.num_lines = 1
+
+    only_re = kwargs.get('re', '')
+    if only_re != '':
+        _filter.from_string = only_re
+        _filter.num_lines = 1
+        _filter.from_is_re = True
+
+    return _filter
diff --git a/test/runtest/run.py b/test/runtest/run.py
new file mode 100644
index 0000000000000000000000000000000000000000..d54a86aa5902e182a400179748c02d551df4ff86
--- /dev/null
+++ b/test/runtest/run.py
@@ -0,0 +1,98 @@
+def run(options, configure, input_files, extra_args=None, filters=None, accepted_errors=None):
+
+    import os
+    import sys
+    import inspect
+    import shlex
+    import subprocess
+    from .exceptions import FailedTestError, BadFilterError, FilterKeywordError
+    from .copy import copy_path
+    from .check import check
+
+    # here we find out where the test script sits
+    frame = inspect.stack()[-1]
+    module = inspect.getmodule(frame[0])
+    caller_file = module.__file__
+    caller_dir = os.path.dirname(os.path.realpath(caller_file))
+
+    # if the work_dir is different from caller_dir
+    # we copy all files under caller_dir to work_dir
+    if options.work_dir != caller_dir:
+        copy_path(caller_dir, options.work_dir)
+
+    launcher, command, output_prefix, relative_reference_path = configure(options, input_files, extra_args)
+
+    launch_script_path = os.path.normpath(os.path.join(options.binary_dir, launcher))
+
+    if not options.skip_run and not os.path.exists(launch_script_path):
+        sys.stderr.write('ERROR: launch script/binary {0} not found in {1}\n'.format(launcher, options.binary_dir))
+        sys.stderr.write('       have you set the correct --binary-dir (or -b)?\n')
+        sys.stderr.write('       try also --help\n')
+        sys.exit(-1)
+
+    sys.stdout.write('\nrunning test with input files {0} and args {1}\n'.format(input_files, extra_args))
+
+    if options.skip_run:
+        sys.stdout.write('(skipped run with -s|--skip-run)\n')
+    else:
+        if sys.platform != "win32":
+            command = shlex.split(command)
+
+        process = subprocess.Popen(command,
+                                   cwd=options.work_dir,
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+                                   universal_newlines=True)
+        stdout, stderr = process.communicate()
+
+        if output_prefix is None:
+            _output_prefix = os.path.join(options.work_dir, '')
+        else:
+            _output_prefix = os.path.join(options.work_dir, output_prefix) + '.'
+        with open('{0}{1}'.format(_output_prefix, 'stdout'), 'w') as f:
+            f.write(stdout.decode('UTF-8'))
+
+        with open('{0}{1}'.format(_output_prefix, 'stderr'), 'w') as f:
+            f.write(stderr.decode('UTF-8'))
+
+        if process.returncode != 0:
+            sys.stdout.write('ERROR: crash during {0}\n{1}'.format(command, stderr))
+            return 1
+
+    if accepted_errors is not None:
+        for error in accepted_errors:
+            if error in stderr:
+                # we found an error that we expect/accept
+                sys.stdout.write('found error which is expected/accepted: {0}\n'.format(error))
+
+    if filters is None:
+        sys.stdout.write('finished (no reference)\n')
+    elif options.no_verification:
+        sys.stdout.write('finished (verification skipped)\n')
+    else:
+        try:
+            for suffix in filters:
+                if output_prefix is None:
+                    output = suffix
+                else:
+                    output = '{0}.{1}'.format(output_prefix, suffix)
+                check(filter_list=filters[suffix],
+                      out_name=os.path.join(options.work_dir, output),
+                      ref_name=os.path.join(options.work_dir, relative_reference_path, output),
+                      log_dir=options.work_dir,
+                      verbose=options.verbose)
+            sys.stdout.write('passed\n')
+        except IOError as e:
+            sys.stderr.write('ERROR: could not open file {0}\n'.format(e.filename))
+            sys.exit(1)
+        except FailedTestError as e:
+            sys.stderr.write(str(e))
+            return 1
+        except BadFilterError as e:
+            sys.stderr.write(str(e))
+            sys.exit(1)
+        except FilterKeywordError as e:
+            sys.stderr.write(str(e))
+            sys.exit(1)
+    return 0
diff --git a/test/runtest/scissors.py b/test/runtest/scissors.py
new file mode 100644
index 0000000000000000000000000000000000000000..e1532886f0b0553b8c76187d28efb8190df6a155
--- /dev/null
+++ b/test/runtest/scissors.py
@@ -0,0 +1,109 @@
+
+
+def cut_sections(text,
+                 from_string=None,
+                 from_is_re=False,
+                 to_string=None,
+                 to_is_re=False,
+                 num_lines=0):
+    """
+    Cuts out sections of the text between anchors.
+
+    Returns:
+        output - list of remaining lines
+    """
+    import re
+
+    output = []
+
+    for i, _ in enumerate(text):
+
+        start_line_matches = False
+        if from_is_re:
+            start_line_matches = re.match(r'.*{0}'.format(from_string), text[i])
+        else:
+            if from_string is None:
+                # we are comparing entire file
+                return text
+            else:
+                start_line_matches = (from_string in text[i])
+
+        if start_line_matches:
+            if num_lines > 0:
+                for n in range(i, i + num_lines):
+                    output.append(text[n])
+            else:
+                for j in range(i, len(text)):
+
+                    end_line_matches = False
+                    if to_is_re:
+                        end_line_matches = re.match(r'.*{0}'.format(to_string), text[j])
+                    else:
+                        end_line_matches = (to_string in text[j])
+
+                    if end_line_matches:
+                        for n in range(i, j + 1):
+                            output.append(text[n])
+                        return output
+
+    return output
+
+
+def test_cut_sections():
+
+    text = '''
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+raboof 1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0
+       1.0 3.0 7.0'''
+
+    res = cut_sections(text=text.splitlines(),
+                       from_string='raboof',
+                       num_lines=5)
+
+    assert res == ['raboof 1.0 3.0 7.0', '       1.0 3.0 7.0', '       1.0 3.0 7.0', '       1.0 3.0 7.0', '       1.0 3.0 7.0']
+
+
+def test_cut_sections_re():
+
+    text = '''
+1.0
+1.0
+    raboof
+2.0
+2.0
+    raboof2
+3.0
+3.0'''
+
+    res = cut_sections(text=text.splitlines(),
+                       from_string='r.*f',
+                       from_is_re=True,
+                       to_string='r.*f2',
+                       to_is_re=True)
+
+    assert res == ['    raboof', '2.0', '2.0', '    raboof2']
+
+
+def test_cut_sections_all():
+
+    text = '''first line
+1.0 2.0 3.0
+1.0 2.0 3.0
+1.0 2.0 3.0
+last line'''
+
+    res = cut_sections(text=text.splitlines())
+
+    assert res == ['first line', '1.0 2.0 3.0', '1.0 2.0 3.0', '1.0 2.0 3.0', 'last line']
diff --git a/test/runtest/test/__init__.py b/test/runtest/test/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/test/runtest/test/different_length/out.txt b/test/runtest/test/different_length/out.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a91c0af8ab208359cd6c968e83163532e12b7166
--- /dev/null
+++ b/test/runtest/test/different_length/out.txt
@@ -0,0 +1 @@
+1.0 2.0 3.0 4.0
diff --git a/test/runtest/test/different_length/ref.txt b/test/runtest/test/different_length/ref.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a95d1b7643e52d8d6e006ac0041358a9ca5d35e0
--- /dev/null
+++ b/test/runtest/test/different_length/ref.txt
@@ -0,0 +1 @@
+1.0 2.0 3.05
diff --git a/test/runtest/test/generic/out.txt b/test/runtest/test/generic/out.txt
new file mode 100644
index 0000000000000000000000000000000000000000..624bef014e21d9411ed63a1e09e10cf31bf51df8
--- /dev/null
+++ b/test/runtest/test/generic/out.txt
@@ -0,0 +1 @@
+1.0 2.0 3.0
diff --git a/test/runtest/test/generic/ref.txt b/test/runtest/test/generic/ref.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a95d1b7643e52d8d6e006ac0041358a9ca5d35e0
--- /dev/null
+++ b/test/runtest/test/generic/ref.txt
@@ -0,0 +1 @@
+1.0 2.0 3.05
diff --git a/test/runtest/test/ignore_order/out.txt b/test/runtest/test/ignore_order/out.txt
new file mode 100644
index 0000000000000000000000000000000000000000..e5773f676480f927409fa3b02750a7ad0e41c4c7
--- /dev/null
+++ b/test/runtest/test/ignore_order/out.txt
@@ -0,0 +1 @@
+4.0 3.0 2.0 3.0 1.2
diff --git a/test/runtest/test/ignore_order/ref.txt b/test/runtest/test/ignore_order/ref.txt
new file mode 100644
index 0000000000000000000000000000000000000000..573c320cd9070f6706552723235316b650d66e7a
--- /dev/null
+++ b/test/runtest/test/ignore_order/ref.txt
@@ -0,0 +1 @@
+4.0 2.0 3.0 3.0 1.2
diff --git a/test/runtest/test/only_string/out.txt b/test/runtest/test/only_string/out.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bdacdbb7de6f93fece15cf55ae5d4fb215fb0c3d
--- /dev/null
+++ b/test/runtest/test/only_string/out.txt
@@ -0,0 +1 @@
+raboof
diff --git a/test/runtest/test/only_string/ref.txt b/test/runtest/test/only_string/ref.txt
new file mode 100644
index 0000000000000000000000000000000000000000..bdacdbb7de6f93fece15cf55ae5d4fb215fb0c3d
--- /dev/null
+++ b/test/runtest/test/only_string/ref.txt
@@ -0,0 +1 @@
+raboof
diff --git a/test/runtest/tuple_comparison.py b/test/runtest/tuple_comparison.py
new file mode 100644
index 0000000000000000000000000000000000000000..533e468590ef055b2579e05d1da614d64c198449
--- /dev/null
+++ b/test/runtest/tuple_comparison.py
@@ -0,0 +1,62 @@
+from sys import float_info
+
+
+def tuple_matches(t,
+                  tolerance=1.0e-8,
+                  error_definition='relative',
+                  ignore_sign=False,
+                  skip_below=float_info.min,
+                  skip_above=float_info.max):
+    """
+    Checks if tuple matches based on tolerance settings.
+
+    Returns:
+        (tuple matches, error message) - error message is None if there is no error
+    """
+
+    assert error_definition in ['relative', 'absolute']
+
+    x, x_ref = t
+
+    # if ignore sign take absolute values
+    if ignore_sign:
+        x = abs(x)
+        x_ref = abs(x_ref)
+
+    if isinstance(x, int) and isinstance(x_ref, int):
+        if x == x_ref:
+            return (True, None)
+        else:
+            return (False, "expected: {0}".format(x_ref))
+
+    if abs(x_ref) < skip_below:
+        return (True, None)
+
+    if abs(x_ref) > skip_above:
+        return (True, None)
+
+    error = x - x_ref
+    if error_definition == 'relative':
+        error /= x_ref
+
+    if abs(error) <= tolerance:
+        return (True, None)
+    else:
+        error_message = 'expected: {0} ({1} diff: {2:6.2e}'.format(x_ref, error_definition[:3], abs(error))
+        if ignore_sign:
+            error_message += ' ignoring signs'
+        error_message += ')'
+        return (False, error_message)
+
+
+def test_tuple_matches():
+    assert tuple_matches((13, 13)) == (True, None)
+    assert tuple_matches((1.0 + 1.0e-9, 1.0)) == (True, None)
+    assert tuple_matches((1.0 + 1.0e-9, 1.0), tolerance=1.0e-10) == (False, 'expected: 1.0 (rel diff: 1.00e-09)')
+    assert tuple_matches((1.0 + 1.0e-7, 1.0)) == (False, 'expected: 1.0 (rel diff: 1.00e-07)')
+    assert tuple_matches((0.01, 0.02), error_definition='absolute') == (False, 'expected: 0.02 (abs diff: 1.00e-02)')
+    assert tuple_matches((0.01, 0.0002), error_definition='absolute', skip_below=0.001) == (True, None)
+    assert tuple_matches((0.01, 2000.0), error_definition='absolute', skip_above=100.0) == (True, None)
+    assert tuple_matches((10.0 + 1.0e-9, -10.0), error_definition='absolute') == (False, 'expected: -10.0 (abs diff: 2.00e+01)')
+    assert tuple_matches((10.0 + 1.0e-9, -10.0), error_definition='absolute', ignore_sign=True) == (True, None)
+    assert tuple_matches((13, 14)) == (False, 'expected: 14')
diff --git a/test/runtest/version.py b/test/runtest/version.py
new file mode 100644
index 0000000000000000000000000000000000000000..38914589546e97c68fbb931760dcfb24e262ec74
--- /dev/null
+++ b/test/runtest/version.py
@@ -0,0 +1,15 @@
+from collections import namedtuple
+
+__version__ = '2.1.1-rc-1'
+
+version_info = namedtuple('version_info', ['major', 'minor', 'micro', 'releaselevel'])
+
+major_minor_micro = __version__.split('-')[0]
+
+s = major_minor_micro.split('.')
+
+version_info.major = int(s[0])
+version_info.minor = int(s[1])
+version_info.micro = int(s[2])
+
+version_info.releaselevel = __version__[len(major_minor_micro) + 1:]
diff --git a/test/runtest_config.py b/test/runtest_config.py
new file mode 100644
index 0000000000000000000000000000000000000000..ae88dfc4180bf56fb76b7d34d31b39cb5ee4f35a
--- /dev/null
+++ b/test/runtest_config.py
@@ -0,0 +1,43 @@
+def configure(options, input_files, extra_args):
+    """
+    This function is used by runtest to configure runtest
+    at runtime for code specific launch command and file naming.
+    """
+
+    from os import path
+    from sys import platform
+
+    launcher = 'lsdalton'
+    launcher_full_path = path.normpath(path.join(options.binary_dir, launcher))
+
+    if len(input_files) == 2:
+        (inp, mol) = input_files
+        extra = None
+    else:
+        # extra can be PCM or PE
+        (inp, mol, extra) = input_files
+
+    inp_no_suffix = path.splitext(inp)[0]
+    mol_no_suffix = path.splitext(mol)[0]
+
+    command = []
+    command.append(launcher_full_path)
+    command.append('-noarch')
+    command.append(inp_no_suffix)
+    command.append(mol_no_suffix)
+    if extra is not None:
+        extra_no_suffix = path.splitext(extra)[0]
+        command.append(extra_no_suffix)
+
+    if extra_args is not None:
+        command.append(extra_args)
+
+    full_command = ' '.join(command)
+
+    output_prefix = '{0}_{1}'.format(inp_no_suffix, mol_no_suffix)
+    if extra is not None:
+        output_prefix += '_{0}'.format(extra_no_suffix)
+
+    relative_reference_path = 'reference'
+
+    return launcher, full_command, output_prefix, relative_reference_path
diff --git a/test/runtest_relaxse.py b/test/runtest_relaxse.py
new file mode 100644
index 0000000000000000000000000000000000000000..a5a5f71c77230f9874530bf8f299dd90021f0680
--- /dev/null
+++ b/test/runtest_relaxse.py
@@ -0,0 +1,93 @@
+
+import os
+import sys
+import runtest_v1 as runtest
+
+
+def write_stderr(log_file, s):
+    """
+    Writes s to stderr and to file log_file
+    unless log_file is None.
+    """
+    if log_file != None:
+        with open(log_file, 'w') as f:
+            f.write(s)
+    sys.stderr.write(s)
+
+
+class Filter(runtest.Filter):
+
+    def __init__(self):
+        runtest.Filter.__init__(self)
+
+    def add(self, *args, **kwargs):
+        try:
+            runtest.Filter.add(self, *args, **kwargs)
+        except runtest.FilterKeywordError as e:
+            sys.stderr.write(str(e)) # FIXME currently not written to any log file
+            sys.exit(-1)
+
+
+class TestRun(runtest.TestRun):
+
+    def __init__(self, _file, argv):
+        runtest.TestRun.__init__(self, _file, argv)
+        self.return_code = 0
+
+    def run(self, inp_files, f=None, args='', mpi='', accepted_errors=[]):
+
+        launch_script = os.path.normpath(os.path.join(self.binary_dir,'relaxse.x'))
+        if self.skip_run:
+            sys.stdout.write('\nskipping actual run\n')
+        else:
+            if not os.path.exists(launch_script):
+                sys.stderr.write('ERROR: launch script %s not found\n' % launch_script)
+                sys.stderr.write('       have you set the correct --binary-dir (or -b)?\n')
+                sys.stderr.write('       try also --help\n')
+                sys.exit(-1)
+
+#        launcher = '%s -noarch -nobackup %s' % (launch_script, args)
+        launcher = '%s %s' % (mpi, launch_script)
+
+        commands = []
+        messages = []
+        outputs_no_suffix = []
+        for inp in inp_files:
+            inp_no_suffix = os.path.splitext(inp)[0]
+            output_no_suffix = '%s' % (inp_no_suffix)
+            outputs_no_suffix.append('%s' % (inp_no_suffix,))
+            messages.append('\nrunning test: %s\n' % (inp_no_suffix,))
+            commands.append(launcher + ' %s' % (inp_no_suffix,))
+        for output_no_suffix, message, command in zip(outputs_no_suffix, messages, commands):
+            try:
+                sys.stdout.write(message)
+                runtest.TestRun.execute(self,
+                                        command=command,
+                                        stdout_file_name = '%s.output' % output_no_suffix,
+                                        accepted_errors=accepted_errors)
+                if f is None:
+                    sys.stdout.write('finished (no reference)\n')
+                else:
+                    try:
+                        # f is a suffix-filter dictionary
+                        for suffix in f:
+                            out = '%s.%s' % (output_no_suffix, suffix)
+                            f[suffix].check(self.work_dir, '%s' % out, 'result/%s' % out, self.verbose)
+                        sys.stdout.write('passed\n')
+                    except IOError as e:
+                        write_stderr(self.log, 'lsdalton ERROR: could not open file %s\n' % e.filename)
+                        sys.exit(-1)
+                    except runtest.TestFailedError as e:
+                        write_stderr(self.log, str(e))
+                        self.return_code += 1
+                    except runtest.BadFilterError as e:
+                        write_stderr(self.log, str(e))
+                        sys.exit(-1)
+                    except runtest.FilterKeywordError as e:
+                        write_stderr(self.log, str(e))
+                        sys.exit(-1)
+            except runtest.AcceptedError as e:
+                sys.stdout.write(str(e))
+            except runtest.SubprocessError as e:
+                write_stderr(self.log, str(e))
+                sys.exit(-1)
diff --git a/test/runtest_v1.py b/test/runtest_v1.py
new file mode 100644
index 0000000000000000000000000000000000000000..eed364242555a86ba563044149f7c513f19d1ee6
--- /dev/null
+++ b/test/runtest_v1.py
@@ -0,0 +1,564 @@
+
+"""
+    runtest - Numerically tolerant test library
+
+    Author:
+        Radovan Bast
+
+    License:
+        BSD-3
+        https://github.com/bast/runtest/blob/master/LICENSE
+
+    Documentation:
+        http://runtest.readthedocs.org
+
+    Source:
+        https://github.com/bast/runtest
+
+    Issue tracking:
+        https://github.com/bast/runtest/issues
+"""
+
+import re
+import os
+import sys
+import subprocess
+import shlex
+import shutil
+import string
+from optparse import OptionParser
+
+
+# http://semver.org
+__version__ = '1.3.9'
+
+
+class FilterKeywordError(Exception):
+    pass
+
+
+class TestFailedError(Exception):
+    pass
+
+
+class BadFilterError(Exception):
+    pass
+
+
+class AcceptedError(Exception):
+    pass
+
+
+class SubprocessError(Exception):
+    pass
+
+# ------------------------------------------------------------------------------
+
+
+def is_float(x):
+    return isinstance(x, float)
+
+# ------------------------------------------------------------------------------
+
+
+def is_int(n):
+    return isinstance(n, int)
+
+# ------------------------------------------------------------------------------
+
+
+def tuple_matches(f, tup):
+    """
+    Checks if tuple matches based on f.
+
+    Input:
+        f   -- filter task
+        tup -- tuple
+
+    Returns:
+        (tuple_matches, error_message)
+    """
+
+    x, x_ref = tup
+
+    if f.ignore_sign:
+        # if ignore sign take absolute values
+        x = abs(x)
+        x_ref = abs(x_ref)
+
+    if is_int(x) and is_int(x_ref):
+        if x == x_ref:
+            return (True, None)
+        else:
+            return (False, "expected: %s" % x_ref)
+
+    if abs(x_ref) < f.ignore_below:
+        return (True, None)
+
+    if abs(x_ref) > f.ignore_above:
+        return (True, None)
+
+    error = x - x_ref
+    if f.tolerance_is_relative:
+        error /= x_ref
+        if abs(error) <= f.tolerance:
+            return (True, None)
+        else:
+            if f.ignore_sign:
+                return (False, "expected: %s (rel diff: %6.2e ignoring signs)" % (x_ref, abs(1.0 - abs(x) / abs(x_ref))))
+            else:
+                return (False, "expected: %s (rel diff: %6.2e)" % (x_ref, abs(1.0 - x / x_ref)))
+    else:
+        if abs(error) <= f.tolerance:
+            return (True, None)
+        else:
+            if f.ignore_sign:
+                return (False, "expected: %s (abs diff: %6.2e ignoring signs)" % (x_ref, abs(abs(x) - abs(x_ref))))
+            else:
+                return (False, "expected: %s (abs diff: %6.2e)" % (x_ref, abs(x - x_ref)))
+
+# ------------------------------------------------------------------------------
+
+
+def extract_numbers(f, text):
+    """
+    Input:
+        - f -- filter task
+        - text -- list of lines where we extract numbers from
+
+    Returns:
+        - numbers -- list of numbers
+        - locations -- locations of each number, list of triples
+                      (line, start position, length)
+    """
+
+    numeric_const_pattern = r"""
+    [-+]? # optional sign
+    (?:
+        (?: \d* \. \d+ ) # .1 .12 .123 etc 9.1 etc 98.1 etc
+        |
+        (?: \d+ \.? ) # 1. 12. 123. etc 1 12 123 etc
+    )
+    # followed by optional exponent part if desired
+    (?: [EeDd] [+-]? \d+ ) ?
+    """
+
+    pattern_int = re.compile('^-?[0-9]+$', re.VERBOSE)
+    pattern_float = re.compile(numeric_const_pattern, re.VERBOSE)
+    pattern_d = re.compile(r'[dD]')
+
+    numbers = []
+    locations = []
+
+    for n, line in enumerate(text):
+        i = 0
+        for w in line.split():
+            # do not consider words like TzB1g
+            # otherwise we would extract 1 later
+            if re.match(r'^[0-9\.eEdD\+\-]*$', w):
+                i += 1
+                if (f.use_mask) and (i not in f.mask):
+                    continue
+                is_integer = False
+                if len(pattern_float.findall(w)) > 0:
+                    is_integer = (pattern_float.findall(w) == pattern_int.findall(w))
+                # apply floating point regex
+                for m in pattern_float.findall(w):
+                    index = line.index(m)
+                    # substitute dD by e
+                    m = pattern_d.sub('e', m)
+                    if is_integer:
+                        numbers.append(int(m))
+                    else:
+                        numbers.append(float(m))
+                    locations.append((n, index, len(m)))
+
+    return numbers, locations
+
+# ------------------------------------------------------------------------------
+
+
+def parse_args(input_dir, argv):
+
+    parser = OptionParser(description='runtest %s - Numerically tolerant test library.' % __version__)
+    parser.add_option('--binary-dir',
+                      '-b',
+                      action='store',
+                      default=input_dir,
+                      help='directory containing the binary/launcher [default: %default]')
+    parser.add_option('--work-dir',
+                      '-w',
+                      action='store',
+                      default=input_dir,
+                      help='working directory [default: %default]')
+    parser.add_option('--verbose',
+                      '-v',
+                      action='store_true',
+                      default=False,
+                      help='give more verbose output upon test failure [default: %default]')
+    parser.add_option('--skip-run',
+                      '-s',
+                      action='store_true',
+                      default=False,
+                      help='skip actual calculation(s) [default: %default]')
+    parser.add_option('--debug',
+                      '-d',
+                      action='store_true',
+                      default=False,
+                      help='print verbose debug information [default: %default]')
+    parser.add_option('--log',
+                      '-l',
+                      action='store',
+                      default=None,
+                      help='log file [default: no logging]')
+    (options, args) = parser.parse_args(args=argv[1:])
+
+    if sys.platform == "win32":
+        # on windows we flip possibly wrong slashes
+        options.binary_dir = string.replace(options.binary_dir, '/', '\\')
+        options.work_dir = string.replace(options.work_dir, '/', '\\')
+
+    return options
+
+# ------------------------------------------------------------------------------
+
+
+def copy_path(root_src_dir, root_dst_dir, exclude_files=[]):
+    for src_dir, dirs, files in os.walk(root_src_dir):
+        dst_dir = src_dir.replace(root_src_dir, root_dst_dir)
+        if not os.path.exists(dst_dir):
+            os.makedirs(dst_dir)
+        for f in files:
+            if f not in exclude_files:
+                src_file = os.path.join(src_dir, f)
+                dst_file = os.path.join(dst_dir, f)
+                shutil.copy(src_file, dst_file)
+
+# ------------------------------------------------------------------------------
+
+
+def filter_file(f, file_name, output):
+    """
+    Input:
+        - f -- filter task
+        - file_name -- the output file to filter
+
+    Returns:
+        - output_filtered -- the filtered output
+
+    Raises:
+        - BadFilterError
+    """
+    output_filtered = []
+
+    for i in range(len(output)):
+        start_line_matches = False
+        if f.from_is_re:
+            start_line_matches = re.match(r'.*%s' % f.from_string, output[i])
+        else:
+            start_line_matches = (f.from_string in output[i])
+        if start_line_matches:
+            if f.num_lines > 0:
+                for n in range(i, i + f.num_lines):
+                    output_filtered.append(output[n])
+            else:
+                for j in range(i, len(output)):
+                    f.end_line_matches = False
+                    if f.to_is_re:
+                        f.end_line_matches = re.match(r'.*%s' % f.to_string, output[j])
+                    else:
+                        f.end_line_matches = (f.to_string in output[j])
+                    if f.end_line_matches:
+                        for n in range(i, j + 1):
+                            output_filtered.append(output[n])
+                        break
+
+    if output_filtered == []:
+        if f.num_lines > 0:
+            r = '[%i lines from "%s"]' % (f.num_lines, f.from_string)
+        else:
+            r = '["%s" ... "%s"]' % (f.from_string, f.to_string)
+        message = 'ERROR: filter %s did not extract anything from file %s\n' % (r, file_name)
+        raise BadFilterError(message)
+
+    return output_filtered
+
+# ------------------------------------------------------------------------------
+
+
+def check_for_unrecognized_kw(kwargs):
+
+    recognized_keywords = ['from_re',
+                           'to_re',
+                           're',
+                           'from_string',
+                           'to_string',
+                           'string',
+                           'ignore_below',
+                           'ignore_above',
+                           'ignore_sign',
+                           'mask',
+                           'num_lines',
+                           'rel_tolerance',
+                           'abs_tolerance']
+
+    # check for unrecognized keywords
+    for key in list(kwargs.keys()):
+        if key not in recognized_keywords:
+            available_keywords = (', ').join(recognized_keywords)
+            message = 'ERROR: keyword "%s" not recognized\n       ' % key
+            message += 'available keywords: %s\n' % available_keywords
+            raise FilterKeywordError(message)
+
+# ------------------------------------------------------------------------------
+
+
+def check_for_incompatible_kw(kwargs):
+
+    incompatible_pairs = [('from_re', 'from_string'),
+                          ('to_re', 'to_string'),
+                          ('to_string', 'num_lines'),
+                          ('to_re', 'num_lines'),
+                          ('string', 'from_string'),
+                          ('string', 'to_string'),
+                          ('string', 'from_re'),
+                          ('string', 'to_re'),
+                          ('string', 'num_lines'),
+                          ('re', 'from_string'),
+                          ('re', 'to_string'),
+                          ('re', 'from_re'),
+                          ('re', 'to_re'),
+                          ('re', 'num_lines'),
+                          ('rel_tolerance', 'abs_tolerance')]
+
+    for (kw1, kw2) in incompatible_pairs:
+        if kw1 in list(kwargs.keys()) and kw2 in list(kwargs.keys()):
+            raise FilterKeywordError('ERROR: incompatible keywords: "%s" and "%s"\n' % (kw1, kw2))
+
+# ------------------------------------------------------------------------------
+
+
+class TestRun:
+
+    def __init__(self, _file, argv):
+
+        self.input_dir = input_dir = os.path.dirname(os.path.realpath(_file))
+
+        options = parse_args(input_dir, argv)
+        self.binary_dir = options.binary_dir
+        self.work_dir = options.work_dir
+        self.verbose = options.verbose
+        self.skip_run = options.skip_run
+        self.debug = options.debug
+        self.log = options.log
+
+        if self.work_dir != self.input_dir:
+            copy_path(self.input_dir, self.work_dir)
+
+        os.chdir(self.work_dir)  # FIXME possibly problematic
+
+    def execute(self,
+                command,
+                stdout_file_name='',
+                accepted_errors=[]):
+        """
+        Runs the command.
+
+        Raises:
+            - AcceptedError
+            - SubprocessError
+        """
+        if self.skip_run:
+            return
+
+        if sys.platform != "win32":
+            command = shlex.split(command)
+
+        if self.debug:
+            print(('\nlaunching command: %s' % ' '.join(command)))
+
+        process = subprocess.Popen(command,
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE)
+        stdout, stderr = process.communicate()
+
+        if self.debug:
+            print(('\nstdout:\n%s' % stdout))
+            if stderr != '':
+                print(('\nstderr:\n%s' % stderr))
+
+        for error in accepted_errors:
+            if error in stderr:
+                # we found an error that we expect/accept
+                raise AcceptedError('found error which is expected/accepted: %s\n' % error)
+        if process.returncode != 0:
+            raise SubprocessError('ERROR: crash during %s\n%s' % (command, stderr))
+        if stdout_file_name != '':
+            f = open(stdout_file_name, 'w')
+            f.write(str(stdout))
+            f.close()
+
+
+class _SingleFilter:
+
+    def __init__(self, **kwargs):
+
+        check_for_unrecognized_kw(kwargs)
+        check_for_incompatible_kw(kwargs)
+
+        # now continue with keywords
+        self.from_string = kwargs.get('from_string', '')
+        self.to_string = kwargs.get('to_string', '')
+        self.ignore_sign = kwargs.get('ignore_sign', False)
+        self.ignore_below = kwargs.get('ignore_below', sys.float_info.min)
+        self.ignore_above = kwargs.get('ignore_above', sys.float_info.max)
+        self.num_lines = kwargs.get('num_lines', 0)
+
+        if 'rel_tolerance' in list(kwargs.keys()):
+            self.tolerance = kwargs.get('rel_tolerance')
+            self.tolerance_is_relative = True
+            self.tolerance_is_set = True
+        elif 'abs_tolerance' in list(kwargs.keys()):
+            self.tolerance = kwargs.get('abs_tolerance')
+            self.tolerance_is_relative = False
+            self.tolerance_is_set = True
+        else:
+            self.tolerance_is_set = False
+
+        self.mask = kwargs.get('mask', [])
+        if self.mask == []:
+            self.use_mask = False
+        else:
+            self.use_mask = True
+            for i in self.mask:
+                if i < 1:
+                    raise FilterKeywordError('ERROR: mask starts counting from 1 (first word)\n')
+
+        self.from_is_re = False
+        from_re = kwargs.get('from_re', '')
+        if from_re != '':
+            self.from_string = from_re
+            self.from_is_re = True
+
+        self.to_is_re = False
+        to_re = kwargs.get('to_re', '')
+        if to_re != '':
+            self.to_string = to_re
+            self.to_is_re = True
+
+        only_string = kwargs.get('string', '')
+        if only_string != '':
+            self.from_string = only_string
+            self.num_lines = 1
+
+        only_re = kwargs.get('re', '')
+        if only_re != '':
+            self.from_string = only_re
+            self.num_lines = 1
+            self.from_is_re = True
+
+
+class Filter:
+
+    def __init__(self):
+        self.filter_list = []
+
+    def add(self, *args, **kwargs):
+        """
+        Adds filter task to list of filters.
+
+        Raises:
+            - FilterKeywordError
+        """
+        self.filter_list.append(_SingleFilter(*args, **kwargs))
+
+    def check(self, work_dir, out_name, ref_name, verbose=False):
+        """
+        Compares output (work_dir/out_name) with reference (work_dir/ref_name)
+        applying all filters tasks from the list of filters.
+
+        Input:
+            - work_dir -- working directory
+            - out_name -- actual output file name
+            - ref_name -- reference output file name
+            - verbose  -- give verbose output upon failure
+
+        Returns:
+            - nothing
+
+        Generates the following files in work_dir:
+            - out_name.filtered  -- numbers extracted from output
+            - out_name.reference -- numbers extracted from reference
+            - out_name.diff      -- difference between the two above
+
+        Raises:
+            - TestFailedError
+        """
+
+        log_out = open('%s.filtered' % out_name, 'w')
+        log_ref = open('%s.reference' % out_name, 'w')
+        log_diff = open('%s.diff' % out_name, 'w')
+
+        for f in self.filter_list:
+
+            out_filtered = filter_file(f, out_name, open(out_name).readlines())
+            log_out.write(''.join(out_filtered))
+            out_numbers, out_locations = extract_numbers(f, out_filtered)
+            if f.use_mask and out_numbers == []:
+                raise FilterKeywordError('ERROR: mask %s did not extract any numbers\n' % f.mask)
+
+            ref_filtered = filter_file(f, ref_name, open(ref_name).readlines())
+            log_ref.write(''.join(ref_filtered))
+            ref_numbers, ref_locations = extract_numbers(f, ref_filtered)
+            if f.use_mask and ref_numbers == []:
+                raise FilterKeywordError('ERROR: mask %s did not extract any numbers\n' % f.mask)
+
+            if out_numbers == [] and ref_numbers == []:
+                # no numbers are extracted
+                if out_filtered != ref_filtered:
+                    log_diff.write('ERROR: extracted strings do not match\n')
+                    log_diff.write('own gave:\n')
+                    log_diff.write(''.join(out_filtered) + '\n')
+                    log_diff.write('reference gave:\n')
+                    log_diff.write(''.join(ref_filtered) + '\n')
+
+            # we need to check for len(out_numbers) > 0
+            # for pure strings len(out_numbers) is 0
+            # TODO need to consider what to do with pure strings in future versions
+            if len(out_numbers) == len(ref_numbers) and len(out_numbers) > 0:
+                if not f.tolerance_is_set and (any(map(is_float, out_numbers)) or any(map(is_float, ref_numbers))):
+                    raise FilterKeywordError('ERROR: for floats you have to specify either rel_tolerance or abs_tolerance\n')
+                l = [tuple_matches(f, t) for t in zip(out_numbers, ref_numbers)]
+                matching, errors = list(zip(*l))  # unzip tuples to two lists
+                if not all(matching):
+                    log_diff.write('\n')
+                    for k, line in enumerate(out_filtered):
+                        log_diff.write('.       %s' % line)
+                        for i, num in enumerate(out_numbers):
+                            (line_num, start_char, length) = out_locations[i]
+                            if line_num == k:
+                                if errors[i]:
+                                    log_diff.write('ERROR   %s%s %s\n' % (' ' * start_char, '#' * length, errors[i]))
+
+            if len(out_numbers) != len(ref_numbers):
+                log_diff.write('ERROR: extracted sizes do not match\n')
+                log_diff.write('own gave %i numbers:\n' % len(out_numbers))
+                log_diff.write(''.join(out_filtered) + '\n')
+                log_diff.write('reference gave %i numbers:\n' % len(ref_numbers))
+                log_diff.write(''.join(ref_filtered) + '\n')
+
+        log_out.close()
+        log_ref.close()
+        log_diff.close()
+
+        if os.path.getsize('%s.diff' % out_name) > 0:
+            log_diff = open('%s.diff' % out_name, 'r')
+            diff = ''
+            for line in log_diff.readlines():
+                diff += line
+            log_diff.close()
+            message = "ERROR: test %s failed\n" % out_name
+            if verbose:
+                message += diff
+            raise TestFailedError(message)
diff --git a/test/test_connect.f90 b/test/test_connect.f90
new file mode 100644
index 0000000000000000000000000000000000000000..6360640f1638590052aa0ce26a7c64a6e5f82c15
--- /dev/null
+++ b/test/test_connect.f90
@@ -0,0 +1,53 @@
+program test_connect
+
+  use dimensions
+  use spindetact
+  use utils_wrt
+  use info
+  use vec_storage
+
+  implicit none
+
+  type(connect) :: c
+
+  type(o_infotype)  :: o_info
+  type(detact_list) :: R1
+  type(detact_list),pointer :: rtmp,r00
+  type(rlist) :: r
+  integer(kind=kindact), pointer :: detact_array(:)
+  integer(kindact) :: i
+  integer               :: ndet = 100, indx, no, nact, nelact
+  integer(kindact)      :: diffilist, diffjlist, andijlist
+  integer, dimension(2) :: diffi, diffj, spindiffi, spindiffj
+  integer, allocatable  :: andIJ(:), spinandIJ(:)
+  integer               :: sign_act, Ndiffact_I, Ndiffact_J, nandIJ
+ 
+  no = 0
+  nact = 4
+  nelact = 4
+  o_info%nact = 4
+  
+  allocate(detact_array(ndet))
+  do i=1,ndet
+     detact_array(i) = i
+     !write(6,* ) i
+     !call wrtact(detact_array(i), 6, .false., o_info%nact)
+  enddo
+
+
+  call wrtact(detact_array(89), 6, .false., o_info%nact)
+  call wrtact(detact_array(53), 6, .false., o_info%nact)
+
+  call fill_connect(c, detact_array(89), detact_array(53), no, nact)
+
+  write(*,*) c%diffi
+  write(*,*) c%spindiffi
+  write(*,*) c%diffj
+  write(*,*) c%spindiffj
+  write(*,*) c%andIJ
+  write(*,*) c%spinandIJ
+  
+  deallocate(c%andIJ, c%spinandIJ)
+  deallocate(detact_array)
+
+end program test_connect
diff --git a/test/vector.f90 b/test/vector.f90
new file mode 100644
index 0000000000000000000000000000000000000000..e4bb5af66fd874ef9015d8971244526977783f60
--- /dev/null
+++ b/test/vector.f90
@@ -0,0 +1,37 @@
+program test_vector
+
+  use dimensions
+  use vec_storage
+
+  implicit none
+
+  type(intvec) :: vec1
+  type(intvec), pointer :: tmp
+  integer, pointer :: itmp(:)
+  type(intvecvec) :: vec2
+
+  allocate(itmp(5))
+  itmp(:) = 0
+  itmp(3) = 225
+  
+  call vec_init(vec1,5)
+
+  call vec_zero(vec1)
+  call vec_print(vec1,6)
+
+  call vec_init(vec2,3)
+  call vec_init(vec2,1,4)
+  call vec_init(vec2,2,5)
+
+  nullify(tmp)
+  tmp => vec_get(vec2,2)
+  call vec_from_full(tmp,itmp,5)
+
+  !call vec_print(vec2,6)
+  
+  call vec_free(vec2,1)
+  call vec_free(vec1)
+  call vec_free(vec2)
+
+  deallocate(itmp)
+end program test_vector